ECMAScript 6中的let和const關鍵詞


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 --harmonyuse 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博客。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM