原文:https://www.jianshu.com/p/ecb71343964a
使用 var:
每一次for循環的時候,setTimeout都執行一次, 但是里面的函數沒有被執行,而是被放到了任務隊列里面,等待執行, for循環了4次,就放了4次,當主線程執行完成后,才進入任務隊列里面執行。
使用 let:
for循環頭部的let不僅將i綁定到for循環塊中, 它也將其重新綁定到 **循環體的每一次迭代** 中,確保上一次迭代結束的值重新被賦值。 setTimeout里面的function()屬於一個新的域, 通過 var 定義的變量是無法傳入到這個函數執行域中的, 而通過使用 let 來聲明塊變量,這時候變量就能作用於這個塊, 所以 function就能使用 i 這個變量了; 這個匿名函數的參數作用域 和 for參數的作用域 不一樣。