for (var i=1;i<=5;i++) { setTimeout(function(){ console.log(i) },i*1000) } for循環(huán)語(yǔ)句是如何運(yùn)行的呢?為什么會(huì)輸出5個(gè)6呢?
一開(kāi)始, 程序從for開(kāi)始執(zhí)行, 遇到setTimeout的時(shí)候先不管, 繼續(xù)往后執(zhí)行, 一直執(zhí)行到循環(huán)結(jié)束.好了, setTimeout可以執(zhí)行啦. 連續(xù)六個(gè)setTimeout打印出i, 而此時(shí)的i已經(jīng)是6啦.
}
判斷當(dāng)前i的值是否小于等于5,是的話就加1,因?yàn)槟阌昧藄etTimeout,所以一秒后i的值已經(jīng)變成6了,再輸出的話,就一直是6了
輸出的結(jié)果是:2.就是說(shuō){}
中定義的變量i
會(huì)取代{}
外面的變量i
,即沒(méi)有塊級(jí)作用域.
通過(guò)上面的代碼,可以看出只定義了一個(gè)變量 i
,只有在循環(huán)里面賦值為1~5
,循環(huán)結(jié)束后是 6。而setTimeout
中的代碼是在循環(huán)之后執(zhí)行的,所以輸出的i
是 6。而不是你所想的。因?yàn)?i 只有一個(gè),不可能同時(shí)等于 1,2,3,4,5
.
可以改成(建議先理解上面一段代碼,先不要糾結(jié)ES6的):