let聲明的變量只在let命令所在的代碼塊內(nèi)有效。
const聲明一個只讀的常量屋剑,一旦聲明,常量的值就不能改變趁桃。
let命令
用法:
{
let a=0;
a // 0
}
a //會報錯 refenceError:a is not defined
代碼塊內(nèi)有效
let是在代碼塊內(nèi)有效,var是在全局范圍內(nèi)有效:
{
let a=0;
var b =1;
}
a // referenceError: a is not defined
b //1
不能重復(fù)聲明
let只能聲明一次 var 可以聲明多次:
let a =1油啤;
let a =2蟀苛;
var b =3;
var b=4;
a // identifier 'a' has already been declared
b //4
for 循環(huán)計數(shù)器很適合用let
for(var i=0; i<10;i++) {
setTimeout(function(){
console.log(i);
})
}
//輸出十個 10
for (let j =0;jc10; j++){
setTimeout(function(){
console.log(j);
})
}
//輸出12345
變量 i 是用 var 聲明的,在全局范圍內(nèi)有效幽告,所以全局中只有一個變量 i, 每次循環(huán)時裆甩,setTimeout 定時器里面的 i 指的是全局變量 i ,而循環(huán)里的十個 setTimeout 是在循環(huán)結(jié)束后才執(zhí)行嗤栓,所以此時的 i 都是 10。
變量 j 是用 let 聲明的叨叙,當(dāng)前的 i 只在本輪循環(huán)中有效,每次循環(huán)的 j 其實都是一個新的變量堪澎,所以 setTimeout 定時器里面的 j 其實是不同的變量擂错,即最后輸出12345。
不存在變量提升
let不存在變量提升樱蛤,var會變量提升:
console.log(a); //ReferenceError: a is not defined
let a = "apple";
console.log(b); //undefined
var b = "banana";
變量 b 用 var 聲明存在變量提升钮呀,所以當(dāng)腳本開始運行的時候,b 已經(jīng)存在了昨凡,但是還沒有賦值行楞,所以會輸出 undefined。
變量 a 用 let 聲明不存在變量提升土匀,在聲明變量 a 之前,a 不存在形用,所以會報錯就轧。
const命令
const聲明一個只讀變量,聲明之后不允許改變田度。意味著,一但聲明必須初始化镇饺,否則會報錯乎莉。
用法:
const PI="3.1415926";
PI //3.1415926
const my_age; // syntaxError:missing initializer in const declaration
暫時性死區(qū):
var PI = "a";
if(true){
console.log(PI); // ReferenceError: PI is not defined
const PI = "3.1415926";
}
ES6 明確規(guī)定,代碼塊內(nèi)如果存在 let 或者 const,代碼塊會對這些命令聲明的變量從塊的開始就形成一個封閉作用域惋啃。代碼塊內(nèi)哼鬓,在聲明變量 PI 之前使用它會報錯。