2012-03-18 12 views
1

このコードで混乱少しだけ内部関数と外部関数は同じ変数の独自のコピーを取得しますか?

var counter = function() { 
    //... 
    var count = 0; 
    return function() { 
     return count = count + 1; 
    } 
} 

var nextValue = counter(); 
console.log(nextValue()); 
nextValue.count = 7; 
console.log(nextValue()); 
console.log(nextValue.count); 
console.log(nextValue()); 

出力は、それはカウンター直感的だ

1 
2 
7 
3 

です。カウントには2つの表現があります。 1つは外部関数nextValueにあり、もう1つは内部無名関数だけが見ることができるものです。

正解、または私の何かが欠けていますか?

答えて

4

nextValue.countは、ではありません。は、関数内で宣言されたローカル変数 "count"を参照しています。実際、関数外のコードから関数のローカル変数への参照を作成することはできません。あなたが参照しているのは、単に関数オブジェクトのプロパティです。

したがって、返された関数がアクセスする "count"変数は、その関数に対して事実上完全にプライベートであり、 "counter"関数の呼び出しによって形成されるクロージャー内に保持されます。

あなたはは仕事に、あなたがこれを行うことができることをしたいんでした場合:

function counter() { 
    function actual() { 
    return actual.count = actual.count + 1; 
    } 
    actual.count = 0; 
    return actual; 
} 

編集 —(固定偽のコード)の名前は、「実際には、」内部関数に返される関数の安全なアクセスを提供しますオブジェクト自体;もともと私はそこに「this」とタイプしていましたが、外部コードが明示的に設定しない限り動作しませんでした。

1

あなたがそれを記述する方法は、countは実質的に私的な変数です。 nextValue.countに割り当てると、別のプロパティが作成されます。countは、カウンタによって増分されています。

関連する問題