let聲明的變量只在let命令所在的代碼塊內(nèi)有效。
const聲明一個(gè)只讀的常量,一旦聲明,常量的值就不能改變。
let命令
用法:
{
let a=0;
a // 0
}
a //會(huì)報(bào)錯(cuò) 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)計(jì)數(shù)器很適合用let
for(var i=0; i<10;i++) {
setTimeout(function(){
console.log(i);
})
}
//輸出十個(gè) 10
for (let j =0;jc10; j++){
setTimeout(function(){
console.log(j);
})
}
//輸出12345
變量 i 是用 var 聲明的,在全局范圍內(nèi)有效,所以全局中只有一個(gè)變量 i, 每次循環(huán)時(shí),setTimeout 定時(shí)器里面的 i 指的是全局變量 i ,而循環(huán)里的十個(gè) setTimeout 是在循環(huán)結(jié)束后才執(zhí)行,所以此時(shí)的 i 都是 10。
變量 j 是用 let 聲明的,當(dāng)前的 i 只在本輪循環(huán)中有效,每次循環(huán)的 j 其實(shí)都是一個(gè)新的變量,所以 setTimeout 定時(shí)器里面的 j 其實(shí)是不同的變量,即最后輸出12345。
不存在變量提升
let不存在變量提升,var會(huì)變量提升:
console.log(a); //ReferenceError: a is not defined
let a = "apple";
console.log(b); //undefined
var b = "banana";
變量 b 用 var 聲明存在變量提升,所以當(dāng)腳本開始運(yùn)行的時(shí)候,b 已經(jīng)存在了,但是還沒有賦值,所以會(huì)輸出 undefined。
變量 a 用 let 聲明不存在變量提升,在聲明變量 a 之前,a 不存在,所以會(huì)報(bào)錯(cuò)。
const命令
const聲明一個(gè)只讀變量,聲明之后不允許改變。意味著,一但聲明必須初始化,否則會(huì)報(bào)錯(cuò)。
用法:
const PI="3.1415926";
PI //3.1415926
const my_age; // syntaxError:missing initializer in const declaration
暫時(shí)性死區(qū):
var PI = "a";
if(true){
console.log(PI); // ReferenceError: PI is not defined
const PI = "3.1415926";
}
ES6 明確規(guī)定,代碼塊內(nèi)如果存在 let 或者 const,代碼塊會(huì)對(duì)這些命令聲明的變量從塊的開始就形成一個(gè)封閉作用域。代碼塊內(nèi),在聲明變量 PI 之前使用它會(huì)報(bào)錯(cuò)。