let 和 const 以及var 區別
阿新 • • 發佈:2019-01-30
ES5 只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景。
ES6中增加了塊級作用域的概念,
let 命令
1. let
命令,用來宣告變數。它的用法類似於var
,但是所宣告的變數,只在let
命令所在的程式碼塊內有效。
{
let a =10;
var b= 8;
}
console.log(a);//ReferenceError: a is not defined(let宣告的變數只在當前程式碼塊內有效)
console.log(b);//1
2. 不存在變數提升
對比:
var
命令會發生”變數提升“現象,即變數可以在宣告之前使用,值為undefined
// var 的情況
console.log(a); // 輸出undefined
var a = 2;
// let 的情況
console.log(b); // 報錯ReferenceError
let b = 2;
3. 不允許重複宣告
let
不允許在相同作用域內,重複宣告同一個變數。
4. 暫時性死區
只要塊級作用域記憶體在let
命令,它所宣告的變數就“繫結”(binding)這個區域,不再受外部的影響。在程式碼塊內,使用let
命令宣告變數之前,該變數都是不可用的。這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱 TDZ)。
var tmp = 888; if (true) { tmp = 'abc'; // ReferenceError let tmp; } 說明: 由於存在全域性變數tmp,但是塊級作用域內let又聲明瞭一個區域性變數tmp,同一個作用域內,不能重複宣告同一個變數,所以在let宣告前,對tmp進行賦值則報錯
const
1. const
宣告一個只讀的常量。一旦宣告,常量的值就不能改變。
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
說明:
const一旦初始化賦值,就不能改變
2. const
一旦宣告變數,就必須立即初始化,不能留到以後賦值。對於const
來說,只宣告不賦值,就會報錯
const a;// SyntaxError: Missing initializer in const declaration
說明:const一旦宣告,必須賦值
3. const
命令宣告的常量也是不提升,同樣存在暫時性死區,只能在宣告的位置後面使用。
if (true) {
console.log(b); // ReferenceError
const b = 5;
}
4. const
的作用域與let
命令相同:只在宣告所在的塊級作用域內有效。
if (true) {
const b= 2;
}
console.log(b);//報錯
- var:變數提升(無論宣告在何處,都會被提至其所在作用於的頂部)
- let:無變數提升(未到let宣告時,是無法訪問該變數的)
- const:無變數提升,宣告一個基本型別的時候為常量,不可修改;宣告物件可以修改