let 和const 是ES6新定義的,存在一定特性。
let用來聲明變量,const 用來聲明常量。
一、塊級作用域
-
let、const具有塊級作用域 -
var不存在塊級作用域,可以通過立即執(zhí)行函數(shù)實現(xiàn)塊級作用域
如果在塊級作用域外訪問let聲明的變量,就會報錯。
{
let a = 1;
}
console.log(a); // Uncaught ReferenceError: a is not defined
如果在塊級作用域外訪問const聲明的變量,會報錯。
{
const a = 1;
}
console.log(a); // Uncaught ReferenceError: a is not defined
使用var聲明的變量,不存在塊級作用域,所以不會報錯。
{
var a = 1;
}
console.log(a); // 1
使用var通過立即執(zhí)行函數(shù)實現(xiàn)塊級作用域
(function(){
var a = 1;
})()
console.log(a); // Uncaught ReferenceError: a is not defined
二、 先使用再聲明
-
let、const不能先使用再聲明 -
var可以先使用再聲明
let先使用,在聲明,會報錯
console.log(a); // Uncaught ReferenceError: a is not defined
let a = 1;
const先使用,在聲明,會報錯
console.log(a); // Uncaught ReferenceError: a is not defined
const a = 1;
const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。
const a; // Uncaught SyntaxError
var可以先使用再聲明
console.log(a); // 1
var a = 1;
三、暫時性死區(qū)
在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區(qū)”(temporal dead zone,簡稱 TDZ)。
let 、const 都存在暫時性死區(qū)
var不存在塊級作用域,而且具有變量提升,因此不存在暫時性死區(qū)
let在塊級作用域內(nèi),存在暫時性死區(qū),任何聲明前的調(diào)用都會報錯。
var a = 1;
if(true) {
console.log(a); // Uncaught ReferenceError
let a = 3;
}
const 在塊級作用域內(nèi),存在暫時性死區(qū),任何聲明前的調(diào)用都會報錯
var a = 1;
if(true) {
console.log(a); // Uncaught ReferenceError
const a = 3;
}
var 不存在塊級作用域
var a = 1;
if(true) {
console.log(a); //1
var a = 3;
console.log(a); //3
}
四、 相同作用域內(nèi),重復聲明
-
let、const不能重復聲明 -
var可以重復聲明
let、const不能重復聲明,會報錯
let a = 2;
let a = 3; // Uncaught SyntaxError
const b = 2;
const b = 3 // Uncaught SyntaxError
var 可以重復聲明,且以最后的聲明為準
var c =2;
var c = 4;
console.log(c); // 4
參考資料: