鍍金池/ 問答/HTML/ 關于setTimeout異步隊列

關于setTimeout異步隊列

題目描述

為什么用let來聲明變量就能實現(xiàn)輸出“0、1、2、3”的效果
mark

回答
編輯回答
悶騷型

背景知識1. 涉及到let和var的作用域范圍

  1. let的作用域為塊級,直觀的看就是 {}內,出了大括號這個變量就失效了。
  2. var的作用域為定義這個變量的函數(shù)內,如果不在函數(shù)內,他就是全局的了。

背景知識2. setTimeout為異步執(zhí)行,當同步代碼全部完成后,才會去執(zhí)行它,本例中for循環(huán)跑完后才會依次執(zhí)行各個setTimeout里的function。

過程推演:

  1. 兩個for循環(huán)各創(chuàng)建了4個 setTimeout,他們中都被傳入了變量i,等待for循環(huán)結束后開始執(zhí)行。
  2. 基于背景知識1:var-for 傳入的4個i在for循環(huán)結束后,所有的i都在后續(xù)循環(huán)時被重新賦值,直至最后一次,賦值為4.
    let-for 傳入的4個i在{}內互不影響,后序循環(huán)不會給前面一次的循環(huán)體內的i重新賦值(因為每次循環(huán)都是獨立的{}作用域),故能正常輸出期望值
2018年3月5日 00:41