var variable = value;
存在的問題: 變量提高引發的問題
function get(condition) { if(condition) { var value = 'test'; return value; }else { return null; } }
在JS的預編譯階段,JS引擎會將上面的函數修改以下:git
function get(condition) { var value; if(condition) { value = 'test'; return value; }else { return null; } }
所以,ES6引入了塊級做用域,強化對變量生命週期的控制,塊級做用域:聲明在指定塊做用域內的變量不能被該做用域以外來訪問es6
用法與 var 相同,但能夠把變量的做用域限制在當前代碼塊,變量聲明不會被提高github
function get(condition) { if(condition) { <!-- value 做用域開始 let value = 'test'; return value; 做用域結束 --> }else { return null; } }
同一做用域內不能用 let 重複定義變量函數
var name = 'test'; let name = 'test'; // Uncaught SyntaxError: Identifier 'name' has already been declared
聲明常量,值不可更改(如定義的是對象,則能夠修改對象的值),聲明的變量必須初始化;與 let 同樣,不存在變量提高而且同一做用域內不能用 const 重複定義變量post
const name = 'test'; // 正肯定義並初始化 const obj = {count: 1}; obj.count = 2; const name; // Uncaught SyntaxError: Missing initializer in const declaration var name = 'test'; const name = 'test'; // Uncaught SyntaxError: Identifier 'name' has already been declared const name = 'test1'; name = 'test2'; // Uncaught TypeError: Assignment to constant variable.
由於 let 與 const 不存在變量提高,若是在聲明變量以前使用這些變量則會觸發引用錯誤;只有在變量聲明以後,變量纔會從TDZ中移出,便可正常訪問。es5
typeof value; let value = 'test'; // VM2053:1 Uncaught ReferenceError: value is not defined