私は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
global
undefined
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
window
1つは(ブラウザの)デフォルトオブジェクトのコンテキストでそれを呼び出し、もう1つは何でものコンテキストでそれを呼び出しますthis
。他の関数またはwith
ブロック内にいない限りthis
、デフォルトのオブジェクトになるため、その特定の例に違いはありません。
コンテキストは、関数内で割り当てられる値を決定しthis
ます。