3 回答

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超13個(gè)贊
最簡(jiǎn)單的方法 var 改成let 這是es6的方式
沒(méi)有es6的話 還是用原始的閉包吧
for (var i = 0; i < 10; i++) {
(function(j) { setTimeout(function timer() { console.log(j); }, 0);})(i);
}

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊
最簡(jiǎn)單的: for (var i = 0;i < 10;i++) { console.log(i); }

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
上面各位說(shuō)得很全面了,推薦將 var
替換為 let
,擁抱 es6 吧。
for(let i=0; i<10; i++){ setTimeout(function() { console.log(i); },0) }
這里簡(jiǎn)單說(shuō)明一下為什么如此替換會(huì)有效。
var
命令聲明的變量,在全局范圍內(nèi)有效。例中代碼,全局只有一個(gè)變量i
。每一次循環(huán),i
的值均會(huì)改變,而console.log(i)
里面的i
指向的就是全局的i
,導(dǎo)致運(yùn)行時(shí)輸出的是最后一輪的i
的值,即10
。let
命令聲明的變量,僅在塊級(jí)作用域內(nèi)有效。修改后的代碼,每一次循環(huán)的i
都是一個(gè)新的變量,所以最后輸出0123456789
。
另外一點(diǎn),如果每一輪循環(huán)的變量 i
均為重新聲明,那它怎么知道上一輪循環(huán)的值?
因?yàn)橛浀谩?code>JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量 i
時(shí),就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算。
添加回答
舉報(bào)