ECMAScript6入門 學習之簡介

1.什麼是ECMAScript 6?

ECMAScript 6(如下簡稱ES6)是JavaScript語言的下一代標準,已經在2015年6月正式發佈了。它的目標,是使得JavaScript語言能夠用來編寫複雜的大型應用程序,成爲企業級開發語言。可能你們會疑惑ECMAScript和JavaScript是什麼關係?爲何不是統一命名。javascript

ECMAScript和JavaScript的關係是,前者是後者的規格,後者是前者的一種實現(另外的ECMAScript方言還有Jscript和ActionScript)。在平常場合,這兩個詞是能夠互換的。主要是區分一是由於商標(Java是Sun公司的商標,根據受權協議,只有Netscape公司能夠合法地使用JavaScript這個名字,且JavaScript自己也已經被Netscape公司註冊爲商標。)和二是體現這門語言的制定者是ECMA,不是Netscape,這樣有利於保證這門語言的開放性和中立性。java

2.ECMAScript 6 中變量聲明let和const

2.1 ES6新增了let命令,用來聲明變量

它的用法相似於var,可是所聲明的變量,只在let命令所在的代碼塊內有效。瀏覽器

{
  let a = 1;
  var b = 2;
}
console.log(a); // ReferenceError: a is not defined.

console.log(b); // 2

上面代碼在代碼塊之中,分別用letvar聲明瞭兩個變量。而後在代碼塊以外調用這兩個變量,結果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);
  };
}

上面代碼中,變量ivar聲明的,在全局範圍內都有效。因此每一次循環,新的i值都會覆蓋舊值,致使最後輸出的是最後一輪的i的值。若是使用let,聲明的變量僅在塊級做用域內有效,變量ilet聲明的,當前的i只在本輪循環有效,因此每一次循環的i其實都是一個新的變量,因此最後輸出的是6。運行效果以下:spa

:let不像var那樣會發生"變量提高"現象。因此,變量必定要在聲明後使用,不然會報錯。.net

上面代碼中,變量foovar命令聲明,會發生變量提高,即腳本開始運行時,變量foo已經存在了,可是沒有值,因此會輸出undefined。變量barlet命令聲明,不會發生變量提高。這表示在聲明它以前,變量bar是不存在的,這時若是用到它,就會拋出一個錯誤。code

上面代碼中,存在全局變量tmp,可是塊級做用域內let又聲明瞭一個局部變量tmp,致使後者綁定這個塊級做用域,因此在let聲明變量前,對tmp賦值會報錯。對象

ES6明確規定,在代碼塊中存在let命令,這個區塊對這些命令聲明的變量,從一開始就造成了封閉做用域。凡是在聲明以前就使用這些變量,就會報錯。這在語法上,稱爲「暫時性死區」(temporal dead zone,簡稱TDZ)。blog

:「暫時性死區」也意味着typeof再也不是一個百分之百安全的操做。ip

根據暫時性死區定義,在使用let聲明以前都屬於‘死區’,只要調用該變量就報錯,可是若是不用let聲明,反而不會報錯。

比較特殊的‘死區’,以下:

:ES6規定暫時性死區和不存在變量提高,主要是爲了減小運行時錯誤,防止在變量聲明前就使用這個變量,從而致使意料以外的行爲。這樣的錯誤在ES5是很常見的,如今有了這種規定,避免此類錯誤就很容易。

       let不容許重複聲明,在相同做用域內,不容許重複聲明同一個變量。

2.2 const命令

const 聲明一個只讀的常量。一旦聲明,常量的值就不能改變。const的做用域與let命令相同:只在聲明所在的塊級做用域內有效。const命令聲明的常量也是不提高,一樣存在暫時性死區,只能在聲明的位置後面使用。const聲明的常量,也與let同樣不可重複聲明。

上面代碼代表,const聲明的變量不得改變值,這意味着,const一旦聲明變量,就必須當即初始化,不能留到之後賦值。對於const來講,只聲明不賦值,也會報錯。

:對於複合類型的變量,變量名不指向數據,而是指向數據所在的地址。

       若是真的想將對象凍結,應該使用Object.freeze方法。

3 全局對象屬性

全局對象是最頂層的對象,在瀏覽器環境指的是window對象,在Node.js指的是global對象。ES5之中,全局對象的屬性與全局變量是等價的。

在ES6中,爲了保持兼容性,var命令和function命令聲明的全局變量,依舊是全局對象的屬性;let命令、const命令、class命令聲明的全局變量,不屬於全局對象的屬性。也就是說,從ES6開始,全局變量將逐步與全局對象的屬性脫鉤。

 

 

 

參考資料:

 

阮一峯 著 《ES 6標準入門(第二版)》

 

轉載時請註明:來自w-rain的我的博客

相關文章
相關標籤/搜索