@ (2017年7月11日) [馬克飛象 | Markdown格式]
ECMAScript 6:ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準厢破,正處在快速開發(fā)之中,大部分已經(jīng)完成了治拿,預計將在2015年6月正式發(fā)布摩泪。ES6的目標,是使得JavaScript語言可以用來編寫大型的復雜的應(yīng)用程序劫谅,成為企業(yè)級開發(fā)語言见坑。
- ECMAScript和JavaScript的關(guān)系 :前者是后者的規(guī)格嚷掠,后者是前者的一種實現(xiàn)(另外的 ECMAScript 方言還有 Jscript 和 ActionScript)。日常場合鳄梅,這兩個詞是可以互換的叠国;
es6 babel轉(zhuǎn)碼器安裝配置
let命令
let命令: 聲明變量,用法類似于var戴尸,但let聲明的變量,只在let命令所在的代碼塊內(nèi)有效冤狡。
let和var
{
let a = 10;
var b = 1;
}
console.log(a); // ReferenceError: a is not defined.
console.log(b); // 1
let命令和for循環(huán)
**用let聲明的計數(shù)器i **只在for循環(huán)體內(nèi)有效孙蒙。
let arr = [1,2,3,4,5,6];
for(let i = 0; i < arr.length; i++){
console.log(i);
}
console.log(i);//ReferenceError: i is not defined
使用var,最后輸出的是9
var a = [];
for (var i = 0; i < 10; i++) {
var c = i;
a[i] = function () {
console.log(c);
};
}
a[6](); // 9
使用let悲雳,聲明的變量僅在塊級作用域內(nèi)有效挎峦,最后輸出的是6
var a = [];
for (var i = 0; i < 10; i++) {
let c = i;
a[i] = function () {
console.log(c);
};
}
a[6](); // 6
let不會發(fā)生“變量提升”現(xiàn)象
代碼如下:
function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
console.log(foo);//2
}
do_something();
暫時性死區(qū)
只要塊級作用域內(nèi)存在let命令,它所聲明的變量就“綁定”(binding)這個區(qū)域合瓢,不再受外部的影響坦胶。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
注意:ES6明確規(guī)定,如果區(qū)塊中存在let和const命令晴楔,這個區(qū)塊對這些命令聲明的變量顿苇,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量税弃,就會報錯纪岁。
總之,在代碼塊內(nèi)则果,使用let命令聲明變量之前幔翰,該變量都是不可用的。這在語法上西壮,稱為“暫時性死區(qū)”(temporal dead zone遗增,簡稱 TDZ)
if (true) {
// TDZ開始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ結(jié)束
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
上面代碼中,在let命令聲明變量tmp之前款青,都屬于變量tmp的“死區(qū)”做修。
“暫時性死區(qū)”也意味著typeof不再是一個百分之百安全的操作。
typeof x; // ReferenceError
let x;
//變量x使用let命令聲明可都,所以在聲明之前缓待,都屬于x的“死區(qū)”,只要用到該變量就會報錯渠牲。因此旋炒,typeof運行時就會拋出一個ReferenceError。
//但是签杈,如果一個變量根本沒有被聲明瘫镇,使用typeof反而不會報錯鼎兽。
typeof undeclared_variable // "undefined"
有些“死區(qū)”比較隱蔽,不太容易發(fā)現(xiàn)铣除。
function bar(x = y, y = 2) {
return [x, y];
}
bar(); // 報錯:y is not defined
//正確的:
function bar(x = 2, y = x) {
return [x, y];
}
bar(); // [2, 2]
//另外
var x = x; // 不報錯
let x = x; // 報錯 ReferenceError: x is not defined
ES6 規(guī)定暫時性死區(qū)和let谚咬、const語句不出現(xiàn)變量提升,主要是為了減少運行時錯誤尚粘,防止在變量聲明前就使用這個變量择卦,從而導致意料之外的行為。這樣的錯誤在 ES5 是很常見的郎嫁,現(xiàn)在有了這種規(guī)定秉继,避免此類錯誤就很容易了。
總之泽铛,暫時性死區(qū)的本質(zhì)就是尚辑,只要一進入當前作用域,所要使用的變量就已經(jīng)存在了盔腔,但是不可獲取杠茬,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量弛随。
let不允許在相同作用域內(nèi)瓢喉,重復聲明同一個變量
// 報錯
{
let a = 10;
var a = 1;
}
// 報錯
{
let a = 10;
let a = 1;
}
//報的錯是 Uncaught SyntaxError: Identifier 'a' has already been declared