質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

874閲覧

Javascript this で変数の呼び出し と callback の使い方

mtttttttttttt

総合スコア5

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/11/16 14:49

前提・実現したいこと

map を使用せずに関数で実現する。。。という問題をといていましたが、thisやオブジェクト自体の扱いがわからずつまずきました。答えのコードを見てもさっぱり理解できないため、質問させていただきます。

問題

JavaScript

1var s = [23, 65, 98, 5]; 2 3Array.prototype.myMap = function(callback) { 4 var newArray = []; 5 // Only change code below this line 6 7 // Only change code above this line 8 return newArray; 9}; 10 11var new_s = s.myMap(function(item) { 12 return item * 2; 13});

該当のソースコード

JavaScript

1var s = [23, 65, 98, 5]; 2 3Array.prototype.myMap = function(callback) { 4 var newArray = []; 5 6 // Add your code below this line 7 for (let i = 0; i < this.length; i++) { 8 newArray.push(callback(this[i])); 9 } 10 // Add your code above this line 11 12 return newArray; 13}; 14 15var new_s = s.myMap(function(item) { 16 return item * 2; 17});

疑問点

for (let i = 0; i < this.length; i++) {

にあるthisで、var s = [23, 65, 98, 5];の配列を指しているのはわかるのですが、なぜ

Array.prototype.myMap = function(callback) {

の中でthisで変数sを読み込むことができるのでしょうか?
callback(this[i])ですが、newArray.push(callback(this[i]));でなぜcallbackを指定して

var new_s = s.myMap(function(item) { return item * 2; });

の処理を実行することができるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

なぜ
Array.prototype.myMap = function(callback) {
の中でthisで変数sを読み込むことができるのでしょうか?

javascriptのthisは、関数がどのように呼び出されるかによって自動的に設定されるからです。
hoge.fuga(~)の形式で呼び出された場合、fuga関数内のthisにはhogeが設定されます。
問題のs.myMap(~)であればfuga関数内のthisにはsが設定されるためthisで変数sを読み込むことができます。

this - JavaScript | MDN

callback(this[i])ですが、newArray.push(callback(this[i]));でなぜcallbackを指定して

var new_s = s.myMap(function(item) {
return item * 2;
});

の処理を実行することができるのでしょうか?

単純に「変数に、関数が代入されている」と考えてください。
callback変数には引数として渡されたfunction(item) { return item * 2; }という関数が代入されているので、たとえばcallback(5)を実行すると戻り値は10になります。

投稿2020/11/17 04:56

ku__ra__ge

総合スコア4524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mtttttttttttt

2020/11/18 10:31

改めてよく読み返しましたら、 var new_s = s.myMap(function(item) { return item * 2; }); の引数 function(item) { return item * 2; }) は関数だったたのですね。なので、callbackを呼ぶと引数の関数 function(item) { return item * 2; }) が呼ばれることになる  というこで合っておりますか??
ku__ra__ge

2020/11/18 10:53

はい、そういうことです。
guest

0

Array.prototype.myMap = function(callback) {

Arrayプロトタイプ、
すなわち、配列そのものにメソッドを追加する構文だからです。
なので、var s = [23, 65, 98, 5];s変数は、配列なので、
その配列変数のmyMapメソッドを実行した際は、
thisは、s変数自体を指すことになります。

ですが、ぶっちゃけ、今のご時世に、既存のプロトタイプに対して、
プロトタイプ汚染をする構文は、あまりよろしくないような気がします。
(個人的に)
よほど、既存の物に追加変更を加えねばならないって時なら、考えられますが。
ましてや、クラス構文でも同じことはできるので、
(よりコード保全をした状態で)
あまりよろしくない問題のような気がします。
っと、あくまで個人的見解なので、あしからず。

投稿2020/11/16 15:12

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mtttttttttttt

2020/11/18 10:22

プロトタイプはObjectの元を指す(ここでは配列オブジェクト)ということで合っていますか? myMapメソッドは配列オブジェクトの中身に定義されているものであり、 sオブジェクトから呼び出したので、thisを使い「呼び出し元のオブジェクト」sの値を参照しsの中身を取得する。。。 と考えましたがこの解釈でよろしいでしょうか? 参考 https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/Object_prototypes    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/this
miyabi_takatsuk

2020/11/18 14:15

はい、その解釈で大丈夫ですよ
mtttttttttttt

2020/11/18 17:33

ありがとうございます。プロトタイプの説明もしていただいて感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問