1. 程式人生 > >JavaScript中var、let、const區別?

JavaScript中var、let、const區別?

blog bsp scrip 進行 大括號 不可 輸出 cal cti

簡單來說是: let是修復了var的作用域的一些bug,變的更加好用。let是更好的varvar的作用域是函數作用域由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

上面代碼中,變量ivar命令聲明的,在全局範圍內都有效,所以全局只有一個變量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區別?