背景最近在總結基礎知識,然后看了阮一峰老師的es6教程,其中談及let以及塊級作用域的時候,舉了一個經典的例子,代碼如下:var a = [];for (var i = 0; i < 10; i++) { // 作用域a
a[i] = function () { // 作用域b
console.log(i);
};
}
a[6](); // 10因為es5不存在塊級作用域,所以迭代變量i泄露了,然后對于a數組內每一個函數內的i都是向上查詢作用域a的,所以結果是10。這個沒問題。下面的例子是用let來聲明迭代變量的var a = [];for (let i = 0; i < 10; i++) {
a[i] = function () { console.log(i);
};
}
a[6](); // 6老師是這樣解釋的上面代碼中,變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。疑問我想不通每一次循環的i其實都是一個新的變量這個過程是怎么樣的,如果我理解為每次迭代都是新的一個塊級作用域,那么迭代變量的迭代(i++)是如何傳遞給下一個塊級作用域呢?自知之明雖然我知道結果,也知道這樣的問題是轉牛角尖,就是好奇問問。希望各路英雄指點迷津。
怎么理解for循環中用let聲明的迭代變量每次是新的變量?
ABOUTYOU
2018-09-05 14:34:31