變量聲明方式有 let和var,聲明常量使用 const。es6
用法相似於var,用來聲明變量,可是所聲明的變量只在let命令的代碼塊內有效。數組
{
let a = 10;
}
複製代碼
for循環中的計數器就很合適使用let命令。安全
for (let i = 0;i < 10; i++) {
// ...
}
console.log(i)
複製代碼
計數器i只在for循環體內有效,在循環體外引用就會報錯。 此外,設置循環變量的那部分是一個父做用域,而循環體內部是一個單獨的子做用域。bash
變量提高只發生在「變量提高」現象,即變量能夠在聲明以前使用,值爲undefined。 let聲明的變量必定要在聲明以後使用,不然會報錯。數據結構
變量提高 參照:函數
只要塊級做用域內存在let命令,它所聲明的變量就"綁定"在這個區域了。再也不受外界的影響。 ES6規定,若是區塊中出現let和const命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域。凡是在聲明以前使用這些變量,就會報錯。 這在語法上,稱爲暫時性死區ui
if(true) {
//TDZ開始
tmp = 'abc'
console.log(temp)//ReferenceError
let tmp;//TDZ結束
console.log(tmp)//undefined
tmp =123;
console.log(tmp)//123
}
複製代碼
暫時性死區對 typeof的影響 意味着typeof也不是一個百分百安全的操做。 沒有let以前,typeof運算符是永遠不會報錯的,可是如今使用typeof檢測未被聲明的變量會報ReferenceError。spa
let不容許在相同做用域內,重複聲明同一個變量。指針
{
let a= 1;
let a= 2;//報錯
}
複製代碼
所以 不能在函數內部從新聲明參數。code
const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。 const一旦聲明變量,就必須當即初始化,不能留到之後賦值。 只聲明,不賦值,就會報錯,報語法錯誤SyntaxError。
const實際上,保證的並非變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。 對於簡單類型得數據(數值,字符串,布爾值),值就保存在變量指向的那個內存地址,所以等同於常量。 可是對於複雜類型的數據(對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,至於它指向的數據結構是否是可變的,就不能控制的。只是保證這個指針(地址)不變。