ECMAScript 6中多了兩個定義變量的關鍵詞,一個是let,另一個是const,后者顧名思義就是常量定義,前者的作用域范圍是塊級的。
一般寫過js的童鞋都知道,同其他語言一樣,JS中的變量作用域是函數域而不是塊級分割的,但是涉及到變量提升(hosting),閉包等問題的時候,很多有經驗的程序員依然會頭疼。
var a = 5; if(true){ var a = 10; } console.log(a);//10
上面的結果是10,但是我們看到,在if block內外都有一個a的定義,按我們正常的理解來看,這兩個a應該占用的是不同的內存,而事實上,他們共用同一個內存。為此,ES 6中的let關鍵詞“修復”了這個問題。
let a = 5; if(true){ let a = 10; } console.log(a); //5
let作用在塊級作用域中,所以不管是switch還是if還是for,只要是let定義的變量,他就只能在那個花括號內部起作用。let是一個讓程序員比較省心的一個關鍵詞,而還有一個令人興奮的關鍵詞是let的兄弟const,一旦定義一個變量為const類型,后面就不能對他進行修改。
const aa = 11; alert(aa) //11 aa = 22; alert(aa) //11
關於這兩者的兼容性問題,可以到這里查看http://kangax.github.io/es5-compat-table/es6/
Node已經支持了const和let關鍵詞,可以這樣使用node --harmony和use strict。目前一些瀏覽器還不支持這樣的寫法,但是利用defs.js這個庫可以ES3也支持這個。他的原理就是利用esprima來編譯並重寫你的代碼。比如:
"use strict"; function fn() { const y = 0; for (let x = 0; x < 10; x++) { const y = x * 2; const z = y; } console.log(y); // prints 0 } fn();
經過def.js重新編譯之后變成:
"use strict"; function fn() { var y = 0; for (var x = 0; x < 10; x++) { var y$0 = x * 2; var z = y$0; } console.log(y); // prints 0 } fn();
詳情可以去https://github.com/olov/defs這里瞅瞅。
本文同步自我的github博客。
