哈瞜大家好 我是阿華,今天來跟大家聊聊var 、 let 、const 三種宣告變數的差別
let 和 const主要解決了var三個問題,分別是沒有塊級作用域、重複宣告、變數提升,下面我們接著看:
在 ES6 以前 宣告變數是用 var,而它宣告的變數存在於函數作用域或全局作用域中。而 let 和 const 是在 ES6 中引入的,它們引入了塊級作用域的概念,變數存在於它們被宣告的塊(例如花括號 {})內部。
使用 var 可以重複宣告同一個變數後面宣告會覆蓋掉前面的,而 let 和 const 不允許在同一作用域內重複宣告相同的變數名。
var 有變數提升的特性,即無論在哪裡宣告變數,它都會被提升至所在作用域的頂部,使得在宣告之前就可以使用該變數。
而 let 和 const 不具有變數提升,試圖在變數宣告之前訪問變數會產生暫時性死區(Temporal Dead Zone,TDZ)錯誤。
let 宣告的變數是可變數,可以重新賦值。而 const 宣告的變數是常數,一旦賦值就不能再更改。
使用 var 會在 Window Object 找得到,而 let 和 const 找不到。
適用場景:
在實際應用中,推薦使用 const,除非需要重新賦值,才考慮使用 let;而避免使用 var,因為它存在一些潛在的問題,比如變數提升、作用域與同一名稱變數被覆蓋的問題。
最後我們來看一個經典的例子:
// 綜合 IIFE 閉包 作用域
for (var i = 1; i <= 5; i++) {
setTimeout(function () {
console.log(i);
}, 0);
}
上面例子會打印5個5,要如何讓他依序打印1-5呢?
第一種方法是使用let去宣告變數i,讓它作用於它的塊級作用域
for (let i = 1; i <= 5; i++) {
setTimeout(function () {
console.log(i);
}, 0);
}
第二種方法,是透過IIFE去給函數作用域並執行,讓用var宣告的i作用於函數作用域
for (var i = 1; i <= 5; i++) {
(function (i) {
//相當於閉包
setTimeout(function () {
console.log(i);
}, i * 1000);
})(i);
}