2012-02-15 5 views
2

出力は、次のコードでは12 12です。特定のクロージャの動作を理解するJavaScript

var omg = function(){ 

     var space = {q:12} ; 

     var sq = []; 

     sq[0] = function(){ 
       console.log(space.q); 
       space.q = 14; 
     }; 

     sq[1] = function(){ 
       console.log(space.q); 
     }; 



     return sq; 

}; 

omg()[0](); 
omg()[1](); 
~       

なぜ出力は12 14ではありませんか?

答えて

4

omg()呼び出しは、新しい関数を返します。したがって、omg()[0]()コールは、特定のインスタンスのローカル値qを変更します。私はあなたがこのようにしたとします:

var a = omg() 
a[0](); 
a[1](); 

あなたは期待される出力を得るでしょう。

+0

Nit:2つの新しい関数(作成するレキシカルスコープの「スペース」を「閉じる」)を指定する要素(プロパティ)を持つ新しい配列を返します。 –

+0

Duh、ありがとうそれをキャッチする。 – Prospero

3

omg()は、別のspaceオブジェクトを持つ別のクロージャを生成します。

があなたの期待される動作を取得するには、一度omg()を呼び出し、同じ変数を使用して、その中に両方の機能を呼び出す必要があります:

var arr = omg(); 
arr[0](); 
arr[1](); 
1

omg()の2倍を実行するので、別のspaceオブジェクトで2つの異なるクロージャが得られます。

関連する問題