2

簡単なFacebookアプリをプログラムしようとしています。必要なコードで、これを発見しました:

  // Load the SDK asynchronously
  (function(d){
   var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
   if (d.getElementById(id)) {return;}
   js = d.createElement('script'); js.id = id; js.async = true;
   js.src = "//connect.facebook.net/en_US/all.js";
   ref.parentNode.insertBefore(js, ref);
  }(document));

なぜこの関数は () で囲まれ、最後に (ドキュメント) が平手打ちされているのですか? この JavaScript ソーサリーは見たことがありません。

ご意見ありがとうございます。

4

3 に答える 3

7

documentこれは、引数として渡される自己実行関数です。

これは次のように書き換えることができます。

var myFunc = function(d) {
    // code here
};

myFunc(document);
于 2013-07-31T20:21:53.427 に答える
1

JavaScript には、暗黙のグローバルと呼ばれる機能があります。名前が使用されるたびに、インタープリターはスコープ チェーンを逆方向にたどり、その名前の var ステートメントを探します。何も見つからない場合、その変数はグローバルであると見なされます。割り当てで使用されている場合、グローバルがまだ存在しない場合は作成されます。これは、匿名クロージャーでグローバル変数を使用または作成するのが簡単であることを意味します。残念ながら、特定のファイルでどの変数がグローバルであるかが (人間には) 明らかではないため、これは管理が困難なコードにつながります。

幸いなことに、匿名関数は簡単な代替手段を提供します。グローバルをパラメーターとして匿名関数に渡すことで、それらをコードにインポートします。これは、暗黙のグローバルよりも明確で高速です。次に例を示します。

引用元: https://stackoverflow.com/a/15777654/3086

于 2013-07-31T20:23:29.560 に答える
1

この構文を使用して(document)、関数パラメーターの引数として渡された値を持つクロージャーを作成します。このスタイルは、次のような場合によく使用されます。

for (var x = 0; x < 10; x++) {
  (function(y) {
    $.ajax({ params: {value: y}})...
  })(x);
}

これが行うことは、特定の値のセットをそのコンテキストに強制できることです。これは、ループの特定の値をその反復から行われた ajax 呼び出しで使用できるようにする場合に特に役立ちます。

于 2013-07-31T20:22:25.470 に答える