私はjsで匿名の自己実行関数を使用していました:
((function(){
//do something
})();
しかし、私はこれをどこかで見つけました:
((function(){
//do something
}).call(this);
違いはなんですか?
私はjsで匿名の自己実行関数を使用していました:
((function(){
//do something
})();
しかし、私はこれをどこかで見つけました:
((function(){
//do something
}).call(this);
違いはなんですか?
を渡すthisと、両方の形式が同等になります。
ただし、違いを確認するには、以下のプログラムを確認してください
var x = 5;
var o = { x: 10 };
function f()
{
alert(this.x);
}
f();
f.call(o);
f() -> アラート 5.
f.call(o) -> 10 をアラートします。
最初の例では、ES5モードでない限りthis、はグローバルオブジェクト(windowブラウザランド)になりますundefined。
2番目の例では、呼び出し元のコンテキスト(ES5の場合)またはオブジェクトインスタンスのいずれかthisに依存します。this globalundefined
function Foo() {
var that = this;
(function () {
console.log(this === window);
console.log(this === that);
console.log(typeof this === "undefined");
}());
(function () {
console.log(this === window);
console.log(this === that);
console.log(typeof this === "undefined");
}).call(this);
(function () {
"use strict";
console.log(this === window);
console.log(this === that);
console.log(typeof this === "undefined");
}());
}
new Foo();
[フィドル]
また、コンテキスト.call()を設定するためにエンジンが余分な作業を行う必要があるため、呼び出しが微視的に遅くなることもわかります。this
window1つは(ブラウザの)デフォルトオブジェクトのコンテキストでそれを呼び出し、もう1つは何でものコンテキストでそれを呼び出しますthis。他の関数またはwithブロック内にいない限りthis、デフォルトのオブジェクトになるため、その特定の例に違いはありません。
コンテキストは、関数内で割り当てられる値を決定しthisます。