ES6令人激動的特性
Nick Justice 是 GitHub開發者計劃 的一員。早在ES6語言標準發布之前,他就借助像Babel這樣的轉譯器以及最新版本的瀏覽器在自己的項目中使用ES6特性。他認為,ES6的新特性將極大地改變JavaScript的編寫方式。近日,他在一篇 博文 中介紹了多項令人激動的特性:
Promises:對于JavaScript而言, promises 不是什么新東西,許多庫都提供了這一特性。但現在,它正式成為ES6語言標準的一部分。 這里 有一個使用ES6 Promises處理AJAX請求的例子,從中可以一窺其工作方式。
塊作用域:一般來說,JavaScript的作用域是“基于函數”的。就是說,為了包含一個私有變量,開發者必須聲明一個函數。這點一直為許多使用過它語言的開發者所詬病。但現在,ES6提供了關鍵字 let
,使開發者可以聲明塊級變量,下面是一個例子:
function foo() { let bar = true; if (bar) { var baz = 'hi!'; } console.log(baz); // hi } foo(); function foo2() { let bar = true; if (bar) { let baz = 'hi'; } console.log(baz); // Uncaught ReferenceError: baz未定義 } foo2();
箭頭函數:這是ES6中最令Nick激動的特性之一。 =>
不只是關鍵字 function
的簡寫,它還帶來了其它好處。箭頭函數與包圍它的代碼共享同一個 this
。有經驗的JavaScript開發者都熟悉諸如 var self = this;
或 var that = this
這種引用外圍 this
的模式。但借助 =>
,就不需要這種模式了。
Generators:這是一種新型的JavaScript函數,使開發者可以暫掛他們的函數,并在多次執行中返回不同的值。關于該特性的詳細信息,請閱讀Nick先前寫過的一篇 文章 及查閱 MDN 。這可能是最令Nick激動的特性。
Import(模塊):在ES6語言標準正式發布之前,Nick及其團隊就已經借助諸如 Require.js 和Browserify這樣的框架在項目中使用模塊加載。現在,ES6語言本身就提供了模塊定義,語法如下:
// myModule.js export function myModule(someArg) { return someArg; } // main.js import {myModule} from 'myModule'; myModule('foo'); // 'foo'
除了基本語法外,開發者還可以在一個模塊中多次 export
以及 import
整個模塊作為一個特定的命名空間。然后,就可以通過新命名空間調用模塊中的每個方法:
// myModule.js export var foo = 'foo'; export var bar = 'bar'; // main.js import * as baz from 'myModule'; baz.foo; // 'foo' baz.bar // 'bar'
類:ES6的類存在一些爭議,主要是因為其實現沒有采用傳統的繼承方式。這意味著,新的 class
關鍵字更多的只是位于傳統的原型繼承之上的語法糖。關于JavaScript的原型繼承,請查看 這里 和 這里 。關于ES6類的實例,請查看 這里 。
優化了“尾調用(Tail Calls)”:一直到ES5,函數遞歸調用過多會導致棧溢出(到達內存上限),這是因為函數每次調用自己時都會調用一個新版本。但優化之后,每次調用會同上次調用共享同一個上下文,保證了內存使用率的穩定。