29

githubでコードを見ていると、次のことがわかりました。

(function() {

}).call(this);

これは明らかに自己呼び出しの無名関数です。しかし、なぜこのように書かれているのでしょうか。私は正規のバリアントを見るのに慣れてい(function() {})()ます。

.call(this)自己呼び出し匿名関数を使用することに特別な利点はありますか?


this編集:モジュールのトップレベルで非グローバル値に設定されたいくつかのcommonjs環境のようです。それらは何に設定さthisれているので、保存したいのでしょうか?

4

5 に答える 5

26

デフォルトでは、次のような関数を呼び出すと、関数が作成された囲んでいるコンテキスト内のの値に関係なく、関数内の(function(){/*...*/})()の値が(ブラウザーで)に設定されます。thiswindowthis

を使用すると、 の値を任意callの値に手動で設定できます。thisこの場合、this囲んでいるコンテキストにある の値に設定しています。

次の例を見てください。

var obj = {
    foo:'bar'
};

(function() {
    alert( this.foo ); // "bar"
}).call( obj );

http://jsfiddle.net/LWFAP/

変数thisによって参照されるオブジェクトの値を手動で設定できたことがわかります。obj

于 2011-06-09T02:47:09.627 に答える
7

.call(this)(実際に()は変更するまででした)this厳密なモード、--bareオプション、および/または実行環境(トップレベルthisがグローバルオブジェクトを指していない場合)を通じて、トップレベルの一貫性を確保します。

于 2011-06-09T09:08:34.620 に答える
0

以下を使用して:

> (function() {
>   ...
> }).call(this);`

コードのスコープ内の this (おそらくグローバル オブジェクト) は、関数の this オブジェクトとして設定ます。私が知る限り、それは次と同等です:

(function(global) {
  // global references the object passed in as *this*
  // probably the global object
})(this);

ブラウザーでは、通常、windowはグローバル オブジェクトのエイリアスです (またはエイリアスのように動作します)。

于 2011-06-09T02:53:12.270 に答える
0
C={
    descript: "I'm C!<br>",
    F: function() {
        //set this to the caller context's 'this'
        (function() {
            document.write(this.descript);
        }).call(this);

        //set this to 'window' or 'undefined' depend the mode
        (function() {
            document.write(this.descript);
        })();

        //member function's 'this' is the object self
        document.write(this.descript);
    }
}

window.descript="I'm window!<br>";

C.F();

(function() {}).call(this);thisを匿名で呼び出し元コンテキストに設定できます。this上記はCです。モードに(function() {})();設定または依存します。thiswindowundefined

于 2015-08-27T08:00:24.317 に答える
-3

自己呼び出し関数は、スクリプトが読み込まれるとすぐにその内容を実行するのに役立ちます。これは、グローバル スコープ要素を初期化するのに便利です。

于 2012-06-10T15:00:38.520 に答える