ES6中的var let const應如何選擇

javascript世界裏面的每一個人都在說有關ECMAScript 6 (ES6,也稱做ES 2015)的話題,對象的巨大變化 ( 類 , super() , 等), 函數 (默認參數等), 以及模塊 (導入/導出), 但 不多有人關注 變量以及如何定義。事實上,仍是有一些關注,可是可能關注點並不是正確。我最近參加了英國jQuery會議,在會議上 Dave Methvin 發表了一場關於 ES6簡介 的演講,演講內容包含了不少關於 let 和 const 的內容。javascript

經過這篇文章,我想介紹 var 的這兩個不一樣的關鍵字,以及它們在定義和使用上的區別。而且更重要的,我要肯定哪些人正在考慮在ES6中使用聲明變量的新標準。基本概念是 let 應該馬上取代 var 做爲定義的關鍵字。事實上,按照一些案例, var 簡單的說不該該再在新代碼中使用。 const 關鍵字用在那些永遠不會改變的變量申明, let 用在其餘變量申明上。html

用 let 取代 varjava

這個代碼示例一看上去彷佛比較有戲劇性,可是對咱們思考 let 和 var 的差別來講,顯得不會太多。 var 在離它最近的父函數內建立了一個變量的做用域 let 在它最近的塊級中建立做用於,這些塊包括 for 循環, if 語句以及其餘塊。node

 

 1 function foo ( ) {
 2 
 3 console . log ( x ) ;
 4 
 5 console . log ( y ) ;
 6 
 7 var x = 1 ;
 8 
 9 if ( x === 1 ) {
10 
11 let y = 2 ;
12 
13 }
14 
15 console . log ( y ) ;
16 
17 }
18 
19 foo ( ) ;
20 
21 console . log ( x ) ;

 

在這個例子中,咱們建立了一個 foo 的函數(以及變量做用域),而且稍後咱們調用它。最後一個 console.log() 語句預期會產生一個 ReferenceError ,由於 x 只在 foo() 中定義(做用域)。由於變量提高,第一個console預計將被正常執行。在這個示例中, x 是 undefined 。第二個console預計更加有趣。事實上,兩個 log(y) 都將出錯,由於 let 比 var 的做用於更加嚴格。 y 變量 只存在於 if 塊裏面,不在任何其餘地方。Dave Methvin稱 let 以前的區域叫作「 臨時死亡區 。」程序員

但願這個例子可以向你展現 let 的特性,可是你或許會說有時候你實際上想 有一個 函數範圍做用域的變量。沒問題,簡單的說在函數頂部建立這個變量就行了。數組

 1 function foo ( x ) {
 2 
 3 let y <s4>=</s4><s5> </s5><s6>2</s6><s7>;</s7>
 4 
 5 if ( x === 1 ) {
 6 
 7 y = 2 ;
 8 
 9 }
10 
11 console . log ( y ) ;
12 
13 }
14 
15 foo ( ) ;
16 
17 console . log ( y ) ;

 

上面的函數在函數頂部定義了 y ,所以相比第一個例子,賦予了它更大範圍的做用域。咱們能夠看見 y 在這個函數任意地方均可以訪問,可是在外面不行,所以最後一個 console.log(y) 語句依然會產生 ReferenceError 。在咱們介紹 const 前, 讓咱們重申一下這點:在ES6中 let 應該徹底取代 var 。上面的示例向你展現了 let 十分強大,而且和 var 同樣擁有十分多的靈活性。我 並非第一個這樣說的人 可是我如今是這種想法的信仰者。瀏覽器

常量索引,不是值函數

在ES6中另一個定義變量的關鍵字是 const , 可是它常常被誤會爲一個「常量」。在ES6中, const 表明一個值的 常量索引 (事實上絕大多數語言都提供這樣的功能)。換句話說,變量名字在內存中的指針不可以改變,可是指向這個變量的值 可能 改變。oop

這裏有一個簡單的例子。在下面的例子中咱們能夠建立一個擁有常量索引的數組變量。咱們在以後添加值到這個數組中並不改變這個索引,一切均可以運行起來:spa

 1 const names = [ ] ; 2 3 names . push ( 「Jordan」 ) ; 4 5 console . log ( names ) ; 

可是,若是咱們嘗試修改變量索引到一個新的數組——即便是和如今內容同樣的數組——咱們將得到一個SyntaxError (「Assignment to constant variable」):

const names = [ ] ; names = [ ] ; // Error!

固然,若是你擁有一個指向string或者number的 const ,固然這裏就不會有任何能夠修改的值。全部String和Number的方法返回 新的 值(對象)。

最後一個關於使用 const 的注意事項是參考 let 的新做用域規則!那意味着咱們應該在咱們的代碼中使用 let 和 const 徹底代替 var 。事實上,依然有不少人支持做爲沒有涉及到的遺留代碼只「容許」使用 var 的想法當一個程序員在一個文件中更新一些代碼,他們應該 (而且可能)將全部 var 語句更新爲適當的有適看成用域的 let 或者 const 。

可是隻適配ES6…

那是對的。新的 let 和 const 關鍵字在ES5中不生效,而且所以在絕大多數可執行環境中也不生效。可是,經過相似 Babel 優秀的編譯器, 咱們能夠將咱們寫的ES6 JavaScript代碼編譯爲可在瀏覽器環境中執行的ES5代碼。

對於開發Node.js (以及io.js)的程序員來講,幸運可是咱們不須要考慮某人使用什麼瀏覽器來執行咱們的代碼。若是你正在使用 Node v0.12 (你正在使用,對嗎?), 你能夠經過兩個小修改來使用這些新功能。第一步,你必須使用「harmony」功能來運行你的代碼(最初ES6開發代碼是「harmony」):

~ $ node — harmony / path / to / script

第二個改變是任何使用 let 或 const (或其它ES6功能)的代碼必須使用嚴格模式。爲了實現這個,簡單的將 "use strict;" 放在每一個模塊最頂部。另外一方面,你能夠在CLI中使用 --use-strict 標誌,但這彷佛有些多餘。

在io.js中你沒必要須要 --harmony 標誌,由於全部這些功能都在代碼中集成。可是,你仍是必須使你代碼爲嚴格模式。再次說明,很簡單的經過在你每隔模塊文件頂部加上 "use strict"; 語句來實現。

你在使用io.js嗎?但願StrongLoop支持它嗎? 咱們已經支持了 !除了 StrongLoopAPI平臺 已經能在io.js上運行,咱們也提供給 咱們的顧客在io.js上運行。

如今出去,並建立一個更好的變量聲明工做流程!

 

原文連接 http://www.codesec.net/view/165972.html

相關文章
相關標籤/搜索