2017-10-20 13 views
1

JSでスコープがどのように機能するかを理解しようとしています。JavaScriptスコープを理解する

for(var i = 0; i<5; i++){ 
setTimeout(function timeoutHandler() { 
    var i = i; 
    console.log(i); //undefined 
}) 
} 

console.logプリントundefined 5回:私はこのコードのチャンクの理解で正しいならば、あなたは私を伝えることができます。私が理解しているように、timeoutHandlerが実行されると、自身のローカルスコープが自分のiとなります。したがって、timeoutHandlerの実行中に、インタープリタがi変数を要求し、ローカルスコープで宣言し、この宣言された変数を割り当てに使用することが正しいことが正しいですか?これはなぜそれがundefinedであるかを説明しますが、私は完全に正しいとは確信していません。私が正しく動作するために、このコードは必要ありません おかげ

UPDは、私はちょうどそれがこの例で、それの意味を理解しようとすると、この場合

+0

'のsetTimeoutコールバックハンドラ内VAR I = i'は' i'と 'i'が再びi''に割り当てる前に、まだ定義されていないために新しいスコープを作成します。したがって、 'i'は' undefined'です。 – gurvinder372

+0

まず、 'var i = i'は意味をなさない。 – evolutionxbox

+0

'var i = i'は' var iと等価です。 i = i; '。 – JJJ

答えて

0

でそのように振る舞う理由を理解したい:

for(var i = 0; i<5; i++){ 
 
//create a self executing function 
 
(function(iValue){ 
 
    //in this scope iValue has the i from the loop 
 
    setTimeout(function() { 
 
    console.log(iValue); //will print the correct i 
 
}) 
 
})(i); //pass i in it's current context to the function 
 
}

それともES6で簡単に: 使用letの代わりにvarとなります。 letはブロック内でスコープされているため(ループの各実行はそれ自身のブロックです)、setTimeoutの内部に別の値はありません。

for(let i = 0; i<5; i++){ 
 
    setTimeout(function() { 
 
    console.log(i); //will print the correct i 
 
}) 
 
}

関連する問題