1. 程式人生 > >var let 和const

var let 和const

首先看個栗子,

for (let i=1;i<=5;i++) {
    setTimeout(function(){console.log(i)},i*1000);
}

列印1,2,3,4,5

for (var i=1;i<=5;i++) {
    setTimeout(function(){console.log(i)},i*1000);
}

列印5個6


for (var i=1;i<=5;i++) {
    setTimeout(function(){console.log(i)},i*1000);
}

為什麼呢?

es6的 let 是區域作用域變數,所以每迴圈一次就是一個獨立的作用域,所以5個setTimeout裡的i值是相互獨立的。

而es5的 var是根據函式範圍來區分作用域,迴圈的區域不是一個單獨的作用域,所以一直都是同一個i,當setTimeout開始執行的時候,for迴圈已經結束了,所以會列印5個6。

let命令定義變數有如下特點
(1)變數僅在塊級作用域內有效,並且在塊級作用域內獨立,不受外界影響
(2)變數必須先定義後使用,並且在js預編譯時不存在變數提升
(3)變數讀取仍然按照作用域鏈往上查詢
(4)不可在同一作用域內重複定義變數
(5)在全域性使用let定義變數時,該變數不再屬於全域性屬性。
const命令用於定義常量,一旦賦值完成,則不可再變。其他特性跟let變數一樣。
let,const定義變數,消除了使用var定義變數時帶來的種種意外情況與不合理情況,使得變數的定義變得清晰可控,有了let與const,則不該再使用var定義變數。
另外在let,const的選擇上,const的效率更高,因此,當程式中的變數一旦初始化則不會再改變時,此時使用const更加合理。
當變數需要重複賦值時,則選擇let。