2016-07-21 10 views
1

私はクロージャを理解しようとしています。Javascriptクロージャが期待した結果を提供しない

var a = 1; 

var g = function() { 
    var a = a; 
    return function() { 
    console.log(a); 
    } 
} 

g()(); 

は、私の知る限りでは、関数呼び出しg()()は、すなわち1の値を、ログインする必要があります。しかし、それは、コンソール上でundefinedをログに記録されます。私のコンセプトはどこか弱いと知っていますが、数時間を過ごしてもわかりません。助けてもらえますか?

答えて

1

:あなたは、異なる名前のローカル変数を使用する必要があります。外側スコープvar a = 1からの変数は上書きされます。
例ではこれと等価である:初期値の割当なし

var a = 1; 

var g = function() { 
    var a; // a is undefined 
    a = a; // a = undefined 
    return function() { 
    console.log(a); 
    } 
} 

g()(); 

aは単にundefinedあります。その後、その変数自体をa = a(noop)に割り当て、aundefinedのままにします。

変数ホイストの詳細については、check this articleを参照してください。

1

問題は、これは、両方のローカルスコープの変数を宣言し、自身に割り当てされた行

var a = a; 

である - それはグローバルaと相互作用していません。関数全体のスコープでvar宣言をホイストはJavaScript

var a = 1; 
 

 
var g = function() { 
 
    var b = a; 
 
    return function() { 
 
    console.log(b); 
 
    } 
 
} 
 

 
g()();

+0

Jamesに感謝します。私は答えを受け入れる。 –

関連する問題