0

著書「JavaScript:The Definitive Guide、6th edition」、61ページ、セクション4.5 Invocation Expressionsには、次のように書かれています。

メソッド呼び出しでは、プロパティアクセスの対象thisとなるオブジェクトまたは配列が、関数の実行中にパラメーターの値になります。

誰かが平易な英語でその声明の意味を説明し、例を挙げてもらえますか?特に「物件アクセスの対象」とはどういう意味かわかりません。

どうもありがとう!

4

3 に答える 3

1

JavaScript(今のところ)では、関数の定義方法ではなく、関数の呼び出し方法thisによって決定されます。フラナガンが言っていることは、これを与えられたということです:

foo.bar();

...の呼び出し中にbarthisによって参照されるオブジェクトを参照しfooます。

JavaやC#のような他の言語から来ている場合は、「しかし、確かに常に内thisを指す」と思うかもしれませんが、JavaScriptの場合はそうではありません。例:foobar

var f = foo.bar; // Get a reference to the function, but not calling it
f();             // Now we call it

上記でthisは、への呼び出し内でbarは、それはグローバルオブジェクト(厳密モードでない場合)または ある場合)です。fooundefined

詳細(私のブログ):

于 2013-02-02T10:52:30.307 に答える
0

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参照します。

于 2013-02-02T11:02:08.993 に答える
0

'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]"になります。

于 2013-02-02T11:19:59.757 に答える