ES6新特性--var、let、const

一、 var、let、const編程

var不存在塊級做用域,具備變量提高機制。
let和const存在塊級做用域,不存在變量提高。在同一做用域內只能聲明一次。
## var的說明 ##
function a(flag){
    if(flag){
        console.log(value);      //結果爲undefined,已聲明但未初始化
        var value=1;
        return value;
    }else{
        console.log(value);      //仍舊能夠訪問到value;值爲undefined
    }
}
//上述代碼等價於
function a(flag){
    var value;
    if(flag){
        value=1;
        return value;
    }else{
        console.log(value);      //仍舊能夠訪問到value;值爲undefined
    }
}
## let說明 ##
function a(flag){
    if(flag){
        console.log(value);       // 報錯,由於value此時位於TDZ(後面講)內,沒法訪問
        let value=1;
        return value;
    }else{
        console.log(value);      //value is not defined
    }
}
## const說明 ##
function a(flag){
    if(flag){
        console.log(value);       // 報錯,由於value此時位於TDZ(後面講)內,沒法訪問
        const value=1;        //const必須在聲明的時候初始化,而且其值沒法被從新賦值
        return value;
    }else{
        console.log(value);      //value is not defined
    }
}

二、const在聲明時須要賦值且沒法修改,但若是常量是對象,則對象的屬性能夠修改瀏覽器

const obj={
    name:'Alisa',
    age:25
}
obj=23;        //報錯
obj.age=23;    //容許修改

三、TDZ暫存性死區
JavaScript引擎在掃描代碼發現變量聲明時,若是是使用var聲明的變量,則講變量提高至做用域頂部;若是是採用let和const聲明的變量,則將其放到TDZ中。訪問TDZ中的變量會觸發運行時錯誤,只有執行過變量聲明語句後,變量纔會從TDZ中移出,而後才能夠正常訪問。注意:其針對的是let和const所在的塊級做用域。code

if(flag){
    console.log(typeof value);     //引用錯誤
    let value='time';
}

console.log(typeof value);         //undefined
if(flag){
    console.log(typeof value);     //引用錯誤
    let value='time';
}

四、let、const在循環中的應用對象

//輸出0-9
var funcs=[];
for(let i=0;i<10;i++){
    funcs.push(function(){
        console.log(i);
    })
}
funcs.forEach(function(func){
    func();        //輸出0-9
})
//將上面的let變爲const則會報錯,由於i++操做試圖修改const聲明的常量
//遍歷對象
var person={
    name:"Alisa",
    age:23
};
for(let key in person){
    console.log(key);    //輸出name、age
}
//將上面的let換位const不會報錯,由於每次key的值並不相同,即每次定義一個新的變量

五、var可能修改全局屬性(如瀏覽器環境下的window對象的屬性),而let和const不會修改只是遮蔽ip

var RegExp='hello';
console.log(window.RegExp);       //"hello"
var say='hi';
console.log(window.say);          //"hi"

let RegExp='hello';
console.log(RegExp);       //"hello"
console.log(window.RegExp === RegExp);       //false

const say='hi';
console.log(say);          //"hi"
console.log(window.say);          //undefined

六、實際應用時的tips
使用塊級綁定時:聲明變量默認採用const,只有確實須要改變變量時才使用let。
在編程過程當中若是須要變量提高則使用var聲明變量,不然採用let和const聲明變量,以便更好地控制做用域,避免變量的混用、不可控。作用域

相關文章
相關標籤/搜索