2013-08-09 5 views
14
var ninja = (function(){ 
    function Ninja(){}; 
    return new Ninja(); 
})(); 

上記の機能がかっこでカプセル化されているのはなぜですか。最後に();が表示されるのはなぜですか?次のJavaScriptステートメントを説明しますか?

最終的には();のためにコンストラクタ関数だと思いますが、なぜオブジェクトがカッコで囲まれていますか?

+0

、http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+1

も参照してください:[JavaScriptで無名関数をどのように仕事?](http://stackoverflow.com/questions/1140089/how-does-an-anonymous-function-in-javascript-work)。 –

+0

@KevinDeVoeあなたの複製はより良いです – Dave

答えて

7

このコードは同等です:

function Ninja() { 
    // nothing here 
} 

var ninja = new Ninja(); 

上記のコードでは、関数/オブジェクト忍者はグローバルスコープではありません。

コード(function() {...})();は、基本的に「ここに含まれている機能をすべて取り、すぐに実行する」と言います。だから、それは無名関数を作成し、それを直後に呼び出すことです。

4

Immediately-Invoked Function Expression(またはIIFE)と呼ばれています。新しいスコープを作成し、内容をすぐに実行します。それには多くの用途があります。私が最も利用しているのは、thisキーワードが意味を変えるときです。

var someClass = function() { 
    this.property = something; 
    this.update = (function(obj) { 
     function() { 
      $('.el').each(function() { 
       $(this).html(obj.property); 
      }); 
     }; 
    )(this); 
}; 

に私はその範囲内で意味$('.el').each()this変更内this.propertyを参照したいしながら.each()にループスルーされている現在のDOM要素を指します。ですから、をパラメータとしてIIFEに渡し(そしてそのパラメータをobjと呼んで)、obj.propertyを使用して、$('.el').each(..., function() { ... });の範囲外にあるときは、this.propertyを参照することができます。

それが理にかなっているか示唆したように何かご質問:)

0

を持っている場合なら、私に教えてください:幸いBenalman

に参照のうえ、直ちに、呼び出される関数の式(生命維持) 、でSyntaxError「修正」がありますシンプル。パーサに関数式を期待するために最も広く受け入れられている方法は、括弧で囲むことです.JavaScriptでは、括弧には文を入れることができないためです。この時点で、パーサーはfunctionキーワードを検出すると、それを関数宣言ではなく関数式として解析します。

// //関数の実行コンテキストを利用して //関数の式を即座に呼び出して//「プライバシー」を作成するために、次の2つのパターンを使用できます。「

(関数(){/ *コード* /}は()); //クロックフォードが推奨これ

(関数(){/ *コード* /})(); //しかしこれは、同じようにうまく機能

私は読書をお勧めし
関連する問題