let 和const 是ES6新定義的洪规,存在一定特性印屁。
let用來(lái)聲明變量,const 用來(lái)聲明常量斩例。
一雄人、塊級(jí)作用域
-
let、const
具有塊級(jí)作用域 -
var
不存在塊級(jí)作用域,可以通過(guò)立即執(zhí)行函數(shù)實(shí)現(xiàn)塊級(jí)作用域
如果在塊級(jí)作用域外訪問(wèn)let聲明的變量础钠,就會(huì)報(bào)錯(cuò)恰力。
{
let a = 1;
}
console.log(a); // Uncaught ReferenceError: a is not defined
如果在塊級(jí)作用域外訪問(wèn)const聲明的變量,會(huì)報(bào)錯(cuò)旗吁。
{
const a = 1;
}
console.log(a); // Uncaught ReferenceError: a is not defined
使用var聲明的變量踩萎,不存在塊級(jí)作用域,所以不會(huì)報(bào)錯(cuò)很钓。
{
var a = 1;
}
console.log(a); // 1
使用var通過(guò)立即執(zhí)行函數(shù)實(shí)現(xiàn)塊級(jí)作用域
(function(){
var a = 1;
})()
console.log(a); // Uncaught ReferenceError: a is not defined
二香府、 先使用再聲明
-
let、const
不能先使用再聲明 -
var
可以先使用再聲明
let
先使用码倦,在聲明企孩,會(huì)報(bào)錯(cuò)
console.log(a); // Uncaught ReferenceError: a is not defined
let a = 1;
const
先使用,在聲明袁稽,會(huì)報(bào)錯(cuò)
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;
三民泵、暫時(shí)性死區(qū)
在代碼塊內(nèi)癣丧,使用let命令聲明變量之前槽畔,該變量都是不可用的栈妆。這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone厢钧,簡(jiǎn)稱 TDZ)鳞尔。
let 、const 都存在暫時(shí)性死區(qū)
var不存在塊級(jí)作用域早直,而且具有變量提升寥假,因此不存在暫時(shí)性死區(qū)
let在塊級(jí)作用域內(nèi),存在暫時(shí)性死區(qū)霞扬,任何聲明前的調(diào)用都會(huì)報(bào)錯(cuò)糕韧。
var a = 1;
if(true) {
console.log(a); // Uncaught ReferenceError
let a = 3;
}
const 在塊級(jí)作用域內(nèi),存在暫時(shí)性死區(qū)喻圃,任何聲明前的調(diào)用都會(huì)報(bào)錯(cuò)
var a = 1;
if(true) {
console.log(a); // Uncaught ReferenceError
const a = 3;
}
var 不存在塊級(jí)作用域
var a = 1;
if(true) {
console.log(a); //1
var a = 3;
console.log(a); //3
}
四萤彩、 相同作用域內(nèi),重復(fù)聲明
-
let斧拍、const
不能重復(fù)聲明 -
var
可以重復(fù)聲明
let雀扶、const
不能重復(fù)聲明,會(huì)報(bào)錯(cuò)
let a = 2;
let a = 3; // Uncaught SyntaxError
const b = 2;
const b = 3 // Uncaught SyntaxError
var
可以重復(fù)聲明肆汹,且以最后的聲明為準(zhǔn)
var c =2;
var c = 4;
console.log(c); // 4
參考資料: