ECMAScript 6.0(以下簡稱ES6):是JavaScript語言的下一代標(biāo)準(zhǔn),已經(jīng)在2015年6月正式發(fā)布了猾漫。它的目標(biāo),是使得JavaScript語言可以用來編寫復(fù)雜的大型應(yīng)用程序,成為企業(yè)級開發(fā)語言贱纠。
ECMAScript和JavaScript的關(guān)系 :前者是后者的規(guī)格莫换,后者是前者的一種實現(xiàn)霞玄!1996年11月,JavaScript的創(chuàng)造者Netscape公司拉岁,決定將JavaScript提交給國際標(biāo)準(zhǔn)化組織ECMA坷剧,希望這種語言能夠成為國際標(biāo)準(zhǔn)。次年喊暖,ECMA發(fā)布262號標(biāo)準(zhǔn)文件(ECMA-262)的第一版惫企,規(guī)定了瀏覽器腳本語言的標(biāo)準(zhǔn),并將這種語言稱為ECMAScript哄啄,這個版本就是1.0版雅任。
ECMAScript的歷史:ECMAScript 1.0是1997年發(fā)布的风范,接下來的兩年,連續(xù)發(fā)布了ECMAScript 2.0(1998年6月)和ECMAScript 3.0(1999年12月)2000年沪么,ECMAScript 4.0開始醞釀硼婿。這個版本最后沒有通過,但是它的大部分內(nèi)容被ES6繼承了禽车。因此寇漫,ES6制定的起點其實是2000年。2009年12月殉摔,ECMAScript 5.0版正式發(fā)布州胳。2011年6月,ECMAscript 5.1版發(fā)布逸月。2015年6月栓撞,ECMAScript 6正式通過
Babel轉(zhuǎn)碼器:Babel是一個廣泛使用的ES6轉(zhuǎn)碼器,可以將ES6代碼轉(zhuǎn)為ES5代碼碗硬,從而在現(xiàn)有環(huán)境執(zhí)行
// 轉(zhuǎn)碼前?
input.map(item => item + 1);
// 轉(zhuǎn)碼后?
input.map(function (item) { return item + 1;}) ?
箭頭函數(shù)瓤湘,這個特性還沒有得到廣泛支持,Babel將其轉(zhuǎn)為普通函數(shù)恩尾,就能在現(xiàn)有的JavaScript環(huán)境執(zhí)行了
ECMAScript版本生成的五個階段
Stage 0 - Strawman(展示階段)
Stage 1 - Proposal(征求意見階段)
Stage 2 - Draft(草案階段)
Stage 3 - Candidate(候選人階段)
Stage 4 - Finished(定案階段)
let命令
不存在變量提升
暫時性死區(qū)
let不允許在相同作用域內(nèi)弛说,重復(fù)聲明同一個變量
function () {let a = 10;var a = 1;}
function () {let a = 10;let a = 1;}
塊級作用域:
ES5只有全局作用域和函數(shù)作用域,沒有塊級作用域翰意,這帶來很多不合理的場景木人。
第一種場景,內(nèi)層變量可能會覆蓋外層變量冀偶。
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = "hello world";
}
}
f(); // undefined
上面代碼中醒第,函數(shù)f執(zhí)行后,輸出結(jié)果為undefined进鸠,原因在于變量提升淘讥,導(dǎo)致內(nèi)層的tmp變量覆蓋了外層的tmp變量疚鲤。
第二種場景扣草,用來計數(shù)的循環(huán)變量泄露為全局變量撤逢。
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
上面代碼中,變量i只用來控制循環(huán)搀罢,但是循環(huán)結(jié)束后,它并沒有消失侥猩,泄露成了全局變量榔至。
function f1() {let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}