一、 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聲明變量,以便更好地控制做用域,避免變量的混用、不可控。作用域