@ (2017年7月11日) [馬克飛象 | Markdown格式]
ECMAScript 6:ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準,正處在快速開發之中,大部分已經完成了,預計將在2015年6月正式發布。ES6的目標,是使得JavaScript語言可以用來編寫大型的復雜的應用程序,成為企業級開發語言。
ECMAScript和JavaScript的關系 :前者是后者的規格,后者是前者的一種實現(另外的 ECMAScript 方言還有 Jscript 和 ActionScript)。日常場合,這兩個詞是可以互換的;
es6 babel轉碼器安裝配置
cfcb7e49b9a6d2d6d234d904c6da5a17.png
let命令
let命令: 聲明變量,用法類似于var,但let聲明的變量,只在let命令所在的代碼塊內有效。
let和var
{ let a = 10; var b = 1;}console.log(a); // ReferenceError: a is not defined.console.log(b); // 1
let命令和for循環
**用let聲明的計數器i **只在for循環體內有效。
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,聲明的變量僅在塊級作用域內有效,最后輸出的是6
var a = [];for (var i = 0; i < 10; i++) { let c = i; a[i] = function () { console.log(c); };}a[6](); // 6
let不會發生“變量提升”現象
代碼如下:
function do_something() { console.log(foo); // ReferenceError let foo = 2; console.log(foo);//2}do_something();
暫時性死區
只要塊級作用域內存在let命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響。
var tmp = 123;if (true) { tmp = 'abc'; // ReferenceError let tmp;}
**注意:**ES6明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。
總之,在代碼塊內,使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱 TDZ)
if (true) { // TDZ開始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ結束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123}
上面代碼中,在let命令聲明變量tmp之前,都屬于變量tmp的“死區”。“暫時性死區”也意味著typeof不再是一個百分之百安全的操作。
typeof x; // ReferenceErrorlet x;//變量x使用let命令聲明,所以在聲明之前,都屬于x的“死區”,只要用到該變量就會報錯。因此,typeof運行時就會拋出一個ReferenceError。//但是,如果一個變量根本沒有被聲明,使用typeof反而不會報錯。typeof undeclared_variable // "undefined"
有些“死區”比較隱蔽,不太容易發現。
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 規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。這樣的錯誤在 ES5 是很常見的,現在有了這種規定,避免此類錯誤就很容易了。總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變量就已經存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現,才可以獲取和使用該變量。
let不允許在相同作用域內,重復聲明同一個變量
// 報錯{ let a = 10; var a = 1;}// 報錯{ let a = 10; let a = 1;}//報的錯是 Uncaught SyntaxError: Identifier 'a' has already been declared