著書「JavaScript:The Definitive Guide、6th edition」、61ページ、セクション4.5 Invocation Expressionsには、次のように書かれています。
メソッド呼び出しでは、プロパティアクセスの対象
this
となるオブジェクトまたは配列が、関数の実行中にパラメーターの値になります。
誰かが平易な英語でその声明の意味を説明し、例を挙げてもらえますか?特に「物件アクセスの対象」とはどういう意味かわかりません。
どうもありがとう!
著書「JavaScript:The Definitive Guide、6th edition」、61ページ、セクション4.5 Invocation Expressionsには、次のように書かれています。
メソッド呼び出しでは、プロパティアクセスの対象
this
となるオブジェクトまたは配列が、関数の実行中にパラメーターの値になります。
誰かが平易な英語でその声明の意味を説明し、例を挙げてもらえますか?特に「物件アクセスの対象」とはどういう意味かわかりません。
どうもありがとう!
JavaScript(今のところ)では、関数の定義方法ではなく、関数の呼び出し方法this
によって決定されます。フラナガンが言っていることは、これを与えられたということです:
foo.bar();
...の呼び出し中にbar
、this
によって参照されるオブジェクトを参照しfoo
ます。
JavaやC#のような他の言語から来ている場合は、「しかし、確かに常に内this
を指す」と思うかもしれませんが、JavaScriptの場合はそうではありません。例:foo
bar
var f = foo.bar; // Get a reference to the function, but not calling it
f(); // Now we call it
上記でthis
は、への呼び出し内でbar
は、それはグローバルオブジェクト(厳密モードでない場合)または( ある場合)です。foo
undefined
詳細(私のブログ):
TJの答えを補足するために、ここに例があります:
var o = {}; // define an object
o.name = 'foo'; // add an attribute to the object
var f = function() { // define a function
return this.name; // the function uses this internally
}
o.someFunction = f; // add the function to the object
var result = o.someFunction();
ここで、の値はresult
、'foo'
関数がオブジェクトoで呼び出されたためであり、関数内では、関数が呼び出されたオブジェクトをthis
参照します。
'this'についての私の理解は、'this'が実行中の関数のコンテキストであるということです。
'this'を明示的に変更しない限り、デフォルトの動作では、実行中の関数のコンテキストが関数呼び出しのコンテキストになります。
最初のケース(最も単純):
var writeHelloFromThis = function() {
console.log('hello from ' + this);
};
writeHelloFromThis();
->呼び出しのコンテキストはグローバルオブジェクト、つまりWindowであったため、出力は「hello from[objectWindow]」です。
2番目のケース:オブジェクトを定義し、それにwriteHelloFromThisを追加します:
var anObject={};
anObject.writeHelloFromThis = writeHelloFromThis;
そして今、コンテキストとしてanObjectを使用してwriteHelloFromThisを呼び出します。
anObject.writeHelloFromThis();
->出力は「hellofrom[objectObject]」です:これは関数呼び出しのコンテキストでした:この場合はanObjectです。
3番目のケース、少しトリッキーです:'anObject'のwriteHelloFromThisを別の変数に格納します:
var anObjectsWriteHelloFromThis = anObject.writeHelloFromThis;
anObjectsWriteHelloFromThisは、'anObject'について何も知らなくても、関数(=参照)を格納するだけです。だから私たちが呼ぶなら:
anObjectsWriteHelloFromThis();
呼び出しのコンテキストはグローバルオブジェクト、つまりWindowであったため、出力は「hello from[objectWindow]」になります。
最後の注意:この手順があなたに限定的であると思われる場合、あなたは正しいです:それがいくつかの関数メソッド:bind、call、apply、関数のコンテキストを変更できる理由です。
最後の例:
writeHelloFromThis.call(anObject);
ここでは'this'を強制的にanObjectにするため、出力はWindowsではなく "hello from[objectObject]"になります。