2017-03-20 33 views
-1

私はletが最も近い囲みブロックにスコープされていることを知っています。まだ与えられたコードがそれほど異なって出力される理由を理解できません。var vs forループのjavascript

for (let i = 0; i < 5; i++) { 
    setTimeout(function() { 
    console.log(i) 
    }, 1000) 
} 

// 0,1,2,3,4

for (var i = 0; i < 5; i++) { 
    setTimeout(function() { 
    console.log(i) 
    }, 1000) 
} 

// 5,5,5,5,5

+6

ます。https://開発者を。 mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let – epascarello

+0

アップグレートの説明を読んでください。これは重複していますが、OPがもう少し検索していたはずですが、この質問タイトル、質問体、およびtymeJVの答えが偽装よりも明確になっています。 – labyrinth

答えて

4

ので、時間のでごtimeout状の第2の出力実際には、iが最後の反復に設定されます。どうして?それは実際にのように見えるので、あなたのforvarを使用する場合、変数はループ範囲外で掲揚されているので、:

var i = 0; 
for (i=0;i<5;i++){ 
    //and when your timeout runs, i is 5 
} 
console.log(i); //5 

そしてlet外ホイストしません:

for (let i=0;i<5;i++){ 

} 
console.log(i); //undefined, not hoisted 
+0

とletはopositeです。 –

+0

ブリリアント!タイムアウトがまだ実行されている間、var 'i'はその値をインクリメントしていますよね?タイムアウトのない同じ関数は、両方の場合(let&with varで)同じ出力になります。 – SrAxi

+0

@SrAxiが正しいこと – George