JavaScript中var、let、const區別?
簡單來說是: 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區別?