鍍金池/ 問答/HTML/ 以下語(yǔ)句(ES6)在控制臺(tái)打印出來(lái)的“i”和“timeCount”值不同,原理是

以下語(yǔ)句(ES6)在控制臺(tái)打印出來(lái)的“i”和“timeCount”值不同,原理是什么?

代碼如下:

let timeCount = 0;
for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log("i..", i);
    console.log("timeCount..", timeCount);
  }, 1000 * timeCount);
  timeCount ++;
}

i打印出來(lái)是從0到4,timeCount一直是5,原理是什么呢?

回答
編輯回答
負(fù)我心

1、let綁定作用域
2、你注冊(cè)了5個(gè)setTimeout,等到執(zhí)行的時(shí)候timeCount已經(jīng)改變了

2018年1月19日 20:14
編輯回答
舊時(shí)光

js中[所有異步的]回調(diào)函數(shù)永遠(yuǎn)在正常代碼執(zhí)行完之后才執(zhí)行,哪怕是settimeout延遲0毫秒也改變不了他是回調(diào)函數(shù)的本質(zhì)。

2018年1月14日 22:22
編輯回答
淚染裳

哎……日經(jīng)問題……

請(qǐng)自行搜索:“塊級(jí)作用域”

2017年12月1日 10:19
編輯回答
別傷我

就是一直說(shuō)的閉包
i之所以沒事是因?yàn)橛昧?code>let相當(dāng)于

let timeCount = 0;
for (let i = 0; i < 5; i++) {
    {
        let j = i;//實(shí)際上并沒有 只是為了說(shuō)明i在作用域在{}里

        setTimeout(() => {
            console.log("i..", j);
            console.log("timeCount..", timeCount);
        }, 1000 * timeCount);
        timeCount++;
    }

}

而如果你把i放到全局作用域?qū)?huì)都是5

let timeCount = 0;
let i = 0;
for (; i < 5; i++) {
  setTimeout(() => {
    console.log("i..", i);
    console.log("timeCount..", timeCount);
  }, 1000 * timeCount);
  timeCount ++;
}
2017年6月13日 23:29
編輯回答
拼未來(lái)

很簡(jiǎn)單啊。
因?yàn)?code>for循環(huán)先執(zhí)行,然后再去執(zhí)行異步的setTimeout。

for執(zhí)行完了timeCount就是5了,再去執(zhí)行setTimeout內(nèi)的打印不就是5個(gè)5了!

而i是因?yàn)樵谘h(huán)內(nèi)用了塊級(jí)變量let

for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log("i..", i);    // 1234
  }, 100);
}
2017年9月16日 20:57
編輯回答
放開她
let timeCount = 0;
for (let i = 0; i < 5; i++) {
  setTimeout(() => {
**alert(2)**
    console.log("i..", i);
    console.log("timeCount..", timeCount);
  }, 1000 * timeCount);
**alert(1)**
  timeCount ++;
}

setTimeout即使時(shí)間設(shè)置為0,也是有延遲的啊,加粗的地方alert你就可以看到,會(huì)先執(zhí)行setTimout的下邊,五次之后開始執(zhí)行setTimeout,所以timeCount已經(jīng)加到了5
2017年3月25日 03:45