鍍金池/ 問答/HTML/ 循環(huán)里的定時器如何保存當前循環(huán)的值

循環(huán)里的定時器如何保存當前循環(huán)的值

var value = 0
      while(value++ < 100){
        setTimeout(() => console.log(value),100)
      }

想要結(jié)果是1到100,請問怎么改寫?謝謝


小疑問:
下面這種實現(xiàn)

var value = 0
while(value++ < 100){
    setTimeout((val => console.log(val))(value),100)
}

為什么會在最后的100之后打出一個大值呢?

回答
編輯回答
哎呦喂

樓上的大哥已經(jīng)給了各種改寫。就說下這段代碼為什么輸出100個101,以及為什么打印出一個“大值”吧

var value = 0
      while(value++ < 100){
        setTimeout(() => console.log(value),100)
      }
      

1.首先要理解,setTimeout是異步的,會被放到任務(wù)隊列中,直到主進程里的同步代碼執(zhí)行完畢,才會去任務(wù)隊列執(zhí)行setTimeout

2.所以setTimeout并不一定是在100毫秒后執(zhí)行console.log(value),必須有一個前提,就是主進程的同步代碼執(zhí)行完畢,也就是主進程空閑的情況下,100毫秒后執(zhí)行console.log(value)

3.再回看代碼的執(zhí)行順序,就是0 < 100所以進去,JS看到setTimeout是異步的,它就把里面的函數(shù)扔到任務(wù)隊列中,然后1 < 100繼續(xù)進入循環(huán),JS看到還是setTimeout..就繼續(xù)扔進到任務(wù)隊列里,扔了100次,終于跳出循環(huán)

4.跳出循環(huán)之后,主進程也就都執(zhí)行完了,這時候JS去看任務(wù)隊列里有100個函數(shù),全是打印console.log(value)的,此時value是101,所以就輸出100次101

至于,為什么輸出了一個“大值”,你肯定是在開發(fā)者工具里運行的,你要是在vscode或者其他編輯器里就沒這個問題。開發(fā)者工具你每次回車它都會自動返回一個執(zhí)行結(jié)果的.

比如,你輸入 var a = 10 回車,它返回undefined,就是說這個語句的執(zhí)行結(jié)果是undefined。

2017年1月16日 00:08
編輯回答
忠妾

需要分配新的內(nèi)存,不然每次console.log都是輸出同一塊內(nèi)存,自然是同一個值。

var value = 0;
while (value++ < 100) {
    (function (v) {
        setTimeout(() => console.log(v), 100);
    })(value)
}
2018年2月10日 18:37
編輯回答
莫小染
let value = 0;
while(value++ < 100){
    let thisValue = value;
    setTimeout(() => console.log(thisValue),100);
}
2017年6月5日 17:36
編輯回答
幼梔
var value = 0
while(value++ < 100){
    setTimeout((val => console.log(val))(value),100)
}
2017年1月21日 20:01