標籤:gpo 計算 現象 bug 語句 修改 狀態 初始化 log
簡單來說是: let是修複了var的範圍的一些bug,變的更加好用。let是更好的var。var的範圍是函數範圍由var定義的變數,它範圍在一個函數體內,而不是我們其他語言理解的大括弧{ }內。而let是塊層級(大括弧括起來的內容)
const聲明的變數只可以在聲明時賦值,不可隨意修改,這是最大的特點。
使用var聲明的變數,其範圍為該語句所在的函數內,且存在變數提升現象;
使用let聲明的變數,其範圍為該語句所在的代碼塊內,不存在變數提升;
使用const聲明的是常量,在後面出現的代碼中不能再修改該常量的值。
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //6
console.log(a[6]); // function(){console.log(i)}
既然迴圈結束後,數組a的每一項都是function(){console.log(i)},那麼a[6]()輸出是6是怎麼實現的?難道let儲存了10個狀態?
這是因為 JavaScript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。
var a = [];for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};}
a[6](); // 10
上面代碼中,變數i是var命令聲明的,在全域範圍內都有效,所以全域只有一個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給數組a的函數內部的console.log(i),裡面的i指向的就是全域的i。也就是說,所有數組a的成員裡面的i,指向的都是同一個i,導致運行時輸出的是最後一輪的i的值,也就是 10。
也就是,迴圈結束後,數組a的每一項都是function(){console.log(i)}。在執行a[6]函數前,此時i的值已經是10了。
JavaScript中var、let、const區別?