ECMAScript 6(如下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。它的目標,是使得JavaScript語言能夠用來編寫複雜的大型應用程序,成爲企業級開發語言。可能你們會疑惑ECMAScript和JavaScript是什麼關係?爲何不是統一命名。javascript
ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現(另外的ECMAScript方言還有Jscript和ActionScript)。在平常場合,這兩個詞是能夠互換的。主要是區分一是由於商標(Java是Sun公司的商標,根據受權協議,只有Netscape公司能夠合法地使用JavaScript這個名字,且JavaScript自己也已經被Netscape公司註冊爲商標。)和二是體現這門語言的制定者是ECMA,不是Netscape,這樣有利於保證這門語言的開放性和中立性。java
它的用法相似於var
,可是所聲明的變量,只在let
命令所在的代碼塊內有效。瀏覽器
{ let a = 1; var b = 2; } console.log(a); // ReferenceError: a is not defined. console.log(b); // 2
上面代碼在代碼塊之中,分別用let
和var
聲明瞭兩個變量。而後在代碼塊以外調用這兩個變量,結果let
聲明的變量報錯,var
聲明的變量返回了正確的值。這代表,let
聲明的變量只在它所在的代碼塊有效。安全
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; }
var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; }
上面代碼中,變量i
是var
聲明的,在全局範圍內都有效。因此每一次循環,新的i
值都會覆蓋舊值,致使最後輸出的是最後一輪的i
的值。若是使用let
,聲明的變量僅在塊級做用域內有效,變量i
是let
聲明的,當前的i
只在本輪循環有效,因此每一次循環的i
其實都是一個新的變量,因此最後輸出的是6。運行效果以下:spa
注:let不像var那樣會發生"變量提高"現象。因此,變量必定要在聲明後使用,不然會報錯。.net
上面代碼中,變量foo
用var
命令聲明,會發生變量提高,即腳本開始運行時,變量foo
已經存在了,可是沒有值,因此會輸出undefined
。變量bar
用let
命令聲明,不會發生變量提高。這表示在聲明它以前,變量bar
是不存在的,這時若是用到它,就會拋出一個錯誤。code
上面代碼中,存在全局變量tmp
,可是塊級做用域內let
又聲明瞭一個局部變量tmp
,致使後者綁定這個塊級做用域,因此在let
聲明變量前,對tmp
賦值會報錯。對象
ES6明確規定,在代碼塊中存在let
命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域。凡是在聲明以前就使用這些變量,就會報錯。這在語法上,稱爲「暫時性死區」(temporal dead zone,簡稱TDZ)。blog
注:「暫時性死區」也意味着typeof
再也不是一個百分之百安全的操做。ip
根據暫時性死區定義,在使用let聲明以前都屬於‘死區’,只要調用該變量就報錯,可是若是不用let聲明,反而不會報錯。
比較特殊的‘死區’,以下:
注:ES6規定暫時性死區和不存在變量提高,主要是爲了減小運行時錯誤,防止在變量聲明前就使用這個變量,從而致使意料以外的行爲。這樣的錯誤在ES5是很常見的,如今有了這種規定,避免此類錯誤就很容易。
let不容許重複聲明,在相同做用域內,不容許重複聲明同一個變量。
const 聲明一個只讀的常量。一旦聲明,常量的值就不能改變。const的做用域與let命令相同:只在聲明所在的塊級做用域內有效。const命令聲明的常量也是不提高,一樣存在暫時性死區,只能在聲明的位置後面使用。const聲明的常量,也與let
同樣不可重複聲明。
上面代碼代表,const聲明的變量不得改變值,這意味着,const一旦聲明變量,就必須當即初始化,不能留到之後賦值。對於const來講,只聲明不賦值,也會報錯。
注:對於複合類型的變量,變量名不指向數據,而是指向數據所在的地址。
若是真的想將對象凍結,應該使用Object.freeze
方法。
全局對象是最頂層的對象,在瀏覽器環境指的是window
對象,在Node.js指的是global
對象。ES5之中,全局對象的屬性與全局變量是等價的。
在ES6中,爲了保持兼容性,var
命令和function
命令聲明的全局變量,依舊是全局對象的屬性;let
命令、const
命令、class
命令聲明的全局變量,不屬於全局對象的屬性。也就是說,從ES6開始,全局變量將逐步與全局對象的屬性脫鉤。
參考資料:
阮一峯 著 《ES 6標準入門(第二版)》
轉載時請註明:來自w-rain的我的博客