前言
對呀初學JavaScript的同學來說,變量提升永遠都是過不去的坎,相信我們都遇到過這種情況,看下面
問題:
var
var arr = [];
for(var i = 0; i <= 10; i++ ){
arr[i] = function(){<br> console.log(i)<br> }
}
arr[2]()//輸出為10
變量i是var命令聲明的,在全局范圍內都有效,所以全局只有一個變量i。
每一次循環,變量i的值都會發生改變,而循環內被賦給數組a的函數內部的console.log(i),br標簽 里面的i指向的就是全局的i。
也就是說,所有數組a的成員里面的i,指向的都是同一個i,導致運行時輸出的是最后一輪的i的值,也就是 10。
let
let arr = [];
for(let i = 0; i <= 10; i++ ){
arr[i] = function(){<br> console.log(i)<br> }
} console.lg(arr[2]) //輸出為2
變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。
你可能會問,如果每一輪循環的變量i都是重新聲明的,那它怎么知道上一輪循環的值,從而計算出本輪循環的值?
這是因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算。