2012-01-23 5 views
1

可能性の重複:私はウェブサイトで次のコードを発見した
変数宣言の構文は? VaRのA =(関数(){})()

What do parentheses surrounding a JavaScript object/function/class declaration mean?

var testModule = (function(){ 

    var counter = 0; 

    return { 

     incrementCounter: function() { 

      return counter++; 

     }, 

     resetCounter: function() { 

      console.log('counter value prior to reset:' + counter); 

      counter = 0; 

     } 

    }; 

})(); 

だから、構文var a = (blah balh..)()

それが実際に何を意味しているのは次の? a =()()のような変数宣言の意味は何ですか。

+0

@Shark:確かに...私は –

+1

です。それは '(blah blah)()'ではなく、 '(function(){blah})()'です。つまり、この構文は関数式に対してのみ意味があります。 – nnnnnn

答えて

5

これは、一回使用の関数を定義してすぐに実行することです。通常の関数は次のように作成されることがありますhttp://www.yuiblog.com/blog/2007/06/12/module-pattern/

var f1 = function() { 
    console.log('bar'); 
}; 

そして、あなたがその後そうのようにそれを呼び出すことができます - あなたはモジュールのパターンを命名されているコードは、そのプロパティの詳細については、こちらを参照してください。

f1(); 

しかし、提供された例では、関数が定義され、一度実行され、その機能は2つの機能を持つオブジェクトを返しているの両方:incrementCounterresetCountertestModule.incrementCounter()testModule.resetCounter() モジュールパターンは、単一のオブジェクトを持ち、クロージャーで定義された関数でのみ使用できるいくつかのプロパティをカプセル化したいときに便利です。

2

匿名関数が実行され、戻り値が変数に割り当てられます。

+1

ちょうど不思議なことに、これはクロージャ対 'function(){}();とみなすことができますクロージャではなく、匿名関数だけですか? –

+1

@Matt Lo:これらは同等です:function(){}()と(function(){})()ベストプラクティスとして、2番目の形式が推奨されています。 – ryanlahue

+0

@rla: 'function(){}()'は 'SyntaxError'です。関数宣言には名前が必要です。宣言と無名関数のあいまい性を、構文を追加して取り除く必要があります。 –

関連する問題