0
var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0]();    //[function (){return this;}]
func();            //Window

なぜthis同じではないのかわからない?あなたは私を助けますか?

4

3 に答える 3

3

以下のように考えてください。

arrayfunc[0](); // this refer to arrayfunc
window['func'](); // this refer to window

trueをarrayfunc[0] === func返しても、発信者は異なります。

arrayfunc[0]();オブジェクトを介して関数を呼び出しarrayfunc、、

window['func']();オブジェクトを介して関数を呼び出しましたwindow

于 2012-08-15T07:59:44.663 に答える
1

これはよくある誤解です。メソッドのエイリアスを作成するとき(つまり、あなたが持っているように、それを変数にコミットするとき)this、元のメソッドが実行されたコンテキストが失われることを理解してください。

したがって、たとえば:

var arr = [function() { alert(this[1]); }, 'hello'];
arr[0](); //'hello' - 'this' is the array
var func = arr[0];
func(); //undefined - 'this' is Window

2行目は、メソッドが配列のコンテキストで実行されているため、「hello」を返します。これは、メソッドを配列内から呼び出したためです。

ただし、4行目は同じメソッドを呼び出しますが、設定したエイリアスのコンテキストから(func)を呼び出します。これによりコンテキストがリセットthisされるため、デフォルトを指します-ブラウザでは、これはを意味しwindowます。

関数へのショートカットを作成し、そのコンテキストを保持したい場合は、bind()(ECMA5ブラウザーのみ)を使用してこれを行うことができます。

var func = arr[0].bind(arr);
func(); //'hello'

bind()新しい関数を作成しますが、特定のコンテキストにバインドされます-あなたの場合、それが取得された最初の配列。

于 2012-08-15T08:00:17.853 に答える
1

これは、関数のスコープへの動的ポインターであるためです。たとえば Java のような固定参照ではありません。

于 2012-08-15T07:55:11.700 に答える