題目
for (var i = 0;i < 100;i++) {
setTimeout(() => {
console.log(i);
}, 0);
}
求輸出結(jié)果买决。
答案是:100,100,100,100·······
這道題就是涉及到了變量的作用域。因為ES5沒有塊級作用域带猴,因此for循環(huán)中使用var聲明的變量i是全局變量昔汉,而setTimeout()是一個異步函數(shù),在這里表示在0s后拴清,將console.log(i)加入事件池靶病。然而for中的循環(huán)是同步的,因此口予,同步執(zhí)行for中的循環(huán)娄周,此時i已經(jīng)變?yōu)榱?00,然后console.log(i)就是100了
改進(jìn)方法
- 運(yùn)用閉包
for (var i =0;i < 100;i++) {
(function(i) {
setTimeout(() => {
console.log(i);
}, 0);
})()
}
通過閉包保存i當(dāng)時的值沪停。
- ES6方法
for (let i = 0;i < 100;i++) {
setTimeout(() => {
console.log(i);
}, 0);
}
通過let聲明的變量有了塊級作用域煤辨,因此,console.log中的i值是當(dāng)時for循環(huán)中的i木张。ES6也推薦使用let聲明變量众辨,有很多好處(塊級作用域、暫時性死區(qū)等)
就是這樣:)