var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0](); //[function (){return this;}]
func(); //Window
なぜthis
同じではないのかわからない?あなたは私を助けますか?
var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0](); //[function (){return this;}]
func(); //Window
なぜthis
同じではないのかわからない?あなたは私を助けますか?
以下のように考えてください。
arrayfunc[0](); // this refer to arrayfunc
window['func'](); // this refer to window
trueをarrayfunc[0] === func
返しても、発信者は異なります。
arrayfunc[0]();
オブジェクトを介して関数を呼び出しarrayfunc
、、
window['func']();
オブジェクトを介して関数を呼び出しましたwindow
。
これはよくある誤解です。メソッドのエイリアスを作成するとき(つまり、あなたが持っているように、それを変数にコミットするとき)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()
新しい関数を作成しますが、特定のコンテキストにバインドされます-あなたの場合、それが取得された最初の配列。
これは、関数のスコープへの動的ポインターであるためです。たとえば Java のような固定参照ではありません。