for循環中申明變量用var和let的區別

 

 

 VS

 

 

 

來來來,先做道題!如上,兩個圖片分別輸出什麼?

答案:圖1會在2秒後,輸出3個3;圖2會在2秒之後依次輸出0,1,2

可能大家會納悶,爲什麼用let申明i,就可以正常輸出,而用var就不行呢?

因爲for循環頭部的let不僅將i綁定到for循環塊中,事實上它將其重新綁定到循環體的每一次迭代中,確保上一次迭代結束的值重新被賦值。setTimeout裏面的function()屬於一個新的域,通過 var 定義的變量是無法傳入到這個函數執行域中的,通過使用 let 來聲明塊變量,這時候變量就能作用於這個塊,所以 function就能使用 i 這個變量了。

附:由於 var 命令的變量提升機制,var 命令實際只會執行一次。而 let 命令不存在變量提升,所以每次循環都會執行一次,聲明一個新變量(但初始化的值不一樣)。for 的每次循環都是不同的塊級作用域,let 聲明的變量是塊級作用域的,所以也不存在重複聲明的問題。let聲明變量的for循環裏,每個匿名函數實際上引用的都是一個新的變量。

 

所以,最終結果

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章