ES6:let const

es5 聲明變量

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

let

用法與 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

const

聲明常量,值不可更改(如定義的是對象,則能夠修改對象的值),聲明的變量必須初始化;與 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.

臨時死區(TDZ)

由於 let 與 const 不存在變量提高,若是在聲明變量以前使用這些變量則會觸發引用錯誤;只有在變量聲明以後,變量纔會從TDZ中移出,便可正常訪問。es5

typeof value;
let value = 'test';
// VM2053:1 Uncaught ReferenceError: value is not defined

原文連接:https://arronf2e.github.io/post/es6-let-constcode

相關文章
相關標籤/搜索