57

JavaScriptコードを次のような関数でラップすると、次のようになります。

(function(){

  var field = ...;
  function doSomthing(){...
  ...


})();

これにより、多くのWebページでのスコープの問題が修正されることに気付きました。この慣習は何と呼ばれていますか?

4

7 に答える 7

37

このパターンは、自己呼び出し自己呼び出し関数と呼ばれます。クロージャーを作成することはできますが、それはパターン自体ではなく、パターンの効果(おそらく意図された効果)です。

于 2010-09-15T18:01:03.513 に答える
20

以下のコメントを少し明確にするために、ほとんどの場合、クロージャを作成します。グローバル変数を作成しないように、変数をそのローカルクロージャにスコープします。これにより、物事がクリーンに保たれ、これらの変数に対する潜在的な不要な変更が回避されます。

理由をもう少し説明するいくつかの優れた答えがここにあります: javascriptクロージャはどのように機能しますか?

そのスコープ内の何かが外部スコープに公開された場合にのみ、クロージャーを作成します。これは通常の場合ですが、コードを追加しないと、例を確認できません。何も公開されていない場合、クロージャは作成されません...それ以外の場合は、ただちに実行される匿名関数です。

})();対照的に、最後のフォーマットは、});実際にはそのクロージャーを呼び出して、パラメーターなしですぐに実行します。たとえば、何かが含まれている場合、それは})(something);ここsomethingで最初の引数として渡されます(function(somethingParam){

于 2010-09-15T17:51:18.777 に答える
15

ラッピング関数は、匿名(名前がなく、変数に割り当てられていない)自己実行(それ自体ですぐに実行される)関数と呼ばれます。

このパターンの正確な名前を見たのを覚えていませんが、変数がグローバルスコープにリークするのを防ぎます。

于 2010-09-15T17:51:37.960 に答える
12

ベン・アルマンは、この「パターン」に一般的に使用される用語について興味深い議論をしています。

それについての彼のブログ投稿はここにあります(http://benalman.com/news/2010/11/immediately-invoked-function-expression/)

彼の投稿があなたにとって長すぎる場合は、ここに私の要約があります(この要約は多くを省略しているので、私はまだそれを読むことをお勧めします):

名前付き関数を自己実行/呼び出しする場合は、次のようになります。

// Hello, my name is "foo". I am a named function.
// When I am invoked I invoke my self when I am invoked.
function foo(){
   foo();
}

匿名関数を自己実行/呼び出しする場合は、次のようになります。

// Hello, I have no name...
//   (though I am assigned to the variable "foo" it's not who I am).
// When I am invoked I invoke my self when I am invoked.
// In ECMAScript 5 I no longer work. :-(
var foo = function(){
    arguments.callee();
};

匿名関数をすぐに実行/呼び出す場合は、次のようになります。

// Hello, I have no name. I am immediately invoked.
// People sometimes call me a "self-invoking anonymous function"...
//    even though I don't invoke myself.
// Ben Alman calls me an "Immediately-Invoked Function Expression"...
//    or "iffy" for short.
(function(){ /...code.../ }());

この問題についての私自身の考え:

他の答えは正しいです。あなたが質問していることは、一般に「自己呼び出し匿名関数」と呼ばれます。
ただし、その用語は実際に起こっていることを正確に反映していません。「即時呼び出し関数式」(略して「iffy」)は、より適切な用語のように思われます。


お友達を感動させる楽しい事実:

次のようなIffyを作成することもできます。

!function(){
   alert("immediately invoked!");
}();

また

+function(){
   alert("immediately invoked!");
}();

またはあなたが本当にクレイジーである場合():

!1%-+~function(){
   alert("immediately invoked!");
}();

ほとんどのブラウザ(すべてではないにしても)で、効果は同じです(Facebookは!バージョンを使用します)。

于 2010-12-27T16:00:24.040 に答える
6

Douglas CrockfordとYUIチームは、これをモジュールパターンと呼んでいます。

于 2010-09-30T21:17:19.537 に答える
4

この慣習は何と呼ばれていますか?

これは、即時呼び出し関数式と呼ばれます。つまり、IIFEです。式で関数を定義し、それ自体で(関数を識別子に割り当てずに)実行します。即時実行関数式(IEFE)と呼ばれることもあります。

ベン・アルマンがそれらについてブログ投稿を書く前は、それらは自己呼び出し(匿名)関数としても知られており、それ以来、この用語は一般的ではなくなりました。これは技術的に不正確であり、実際には発生しない再帰的な呼び出しを示唆しています。

構文の詳細については、カプセル化された無名関数の構文と、無名JavaScript関数を自動実行するための括弧の位置を説明してください。

これにより、多くのWebページでのスコープの問題が修正されることに気付きました。

はい、このパターンの目的は、関数を実行することによって追加のスコープを導入することです。

このパターンは、 (リビール)モジュールパターンと呼ばれる戻り値や、再帰的な呼び出しを可能にする関数の名前で拡張されることもあります。

于 2014-07-20T19:44:47.497 に答える
1

それは「パターン」よりも長い間存在しています。これは、特にメタプログラミングを行うときにカプセル化に主に使用されるscheme/lispの一般的なイディオムです。

于 2010-12-28T18:30:30.693 に答える