在es6中驾茴,新增了兩種命名變量的方式:let和const。
1. let
作用域規(guī)則
在es6之前氢卡,只有var一種命名變量的方式锈至。var在當(dāng)前的塊級(jí)和子塊都會(huì)起作用,這樣就會(huì)出現(xiàn)一個(gè)JS的經(jīng)典問題---作用域問題译秦。這無疑給編程增加了難度峡捡,但并沒有提高編程的作用。為了解決這個(gè)問題筑悴,es6引進(jìn)了塊級(jí)作用域:let们拙。
let的聲明方法和var相似:
var a ;
let b ;
但作用的范圍有點(diǎn)不同。
如果只在當(dāng)前作用域或子集當(dāng)中使用雷猪,二者功能相似睛竣。但當(dāng)用到內(nèi)部函數(shù)的時(shí)候,let可以讓代碼更加簡單求摇。像下面這段代碼:
function varTest() {
var x = 1;
if (true) {
var x = 2; // 同樣的變量!
console.log(x); // 2,if當(dāng)中的x覆蓋了上一個(gè)x
}
console.log(x); // 2
}
/********/
function letTest() {
let x = 1;
if (true) {
let x = 2; // 不同的變量射沟,和上一個(gè)x沒有任何關(guān)系
console.log(x); // 2
}
console.log(x); // 1
}
在這段代碼中if語句就是一個(gè)代碼塊,let就是在這個(gè)塊級(jí)代碼中聲明了一個(gè)變量与境,且只作用于這個(gè)塊級(jí)作用域验夯。
再看另一個(gè)經(jīng)典的問題:
for (var i = 0; i <= 5; i++) {
div.onclick = function() {
console.log(i); //6
};
}
在這段代碼中,當(dāng)我們點(diǎn)擊div摔刁,輸出的結(jié)果為6挥转,因?yàn)楫?dāng)循環(huán)結(jié)束的時(shí)候(for之外),還會(huì)執(zhí)行一次共屈。
但如果把var改成let绑谣,結(jié)果就換不一樣:
for (let i = 0; i <= 5; i++) {
div.onclick = function() {
console.log(i); //5
};
}
這是因?yàn)閘et只在for這個(gè)塊級(jí)中起作用。
聲明提前
我們知道JavaScript中有一個(gè)特性拗引,那就是聲明提前借宵。
console.log(a) ; //不會(huì)報(bào)錯(cuò)
var a ;
console.log(b); //報(bào)錯(cuò)
let b;
let不再有聲明提前的特性》鳎可以說這也降低了我們使用JavaScript的難度壤玫。
不能重復(fù)聲明
如果使用var聲明兩個(gè)變量名一樣的變量豁护,后面一個(gè)會(huì)覆蓋前面的,而let不允許這樣做欲间。
var a = 1;
var a = 2;
console.log(a) ; //2
let b = 1;
let b = 2; //報(bào)錯(cuò)
2. const
es6還引入了另一個(gè)變量聲明的方法const楚里。
const和C++中的const一樣,都是聲明了一個(gè)常量猎贴。const聲明的量是一個(gè)只讀的量班缎,不能修改。
const a = 1;
a = 2; //報(bào)錯(cuò)
總結(jié):
JavaScript是一門10天之內(nèi)設(shè)計(jì)出來的語言嘱能,設(shè)計(jì)之初有著許多不完善的地方吝梅,但在es6之后虱疏,很多地方都完善好了惹骂。了解es6的新特性,對(duì)于我們學(xué)習(xí)使用JavaScript做瞪,有著巨大的作用对粪。