let和const

發佈自 Kindem的博客,歡迎你們轉載,可是要注意註明出處。另外,該文章收納在 Kindem的我的的 IT 知識整理倉庫,歡迎 Star、Fork、投稿

let

let是在ES6加入的新的變量聲明方法,let聲明變量的方法和var相似:javascript

let a = 'hello';
var b = 'hello';

let的功能是聲明一個做用域被限制在塊級的變量,而var聲明的變量的做用域只能是全局的或者整個函數塊的java

function varTest() {
    var x = 1;
    if (true) {
        var x = 2;
        // 2
        console.log(x);
    }
    // 2
    console.log(x);
}

function letTest() {
    let x = 1;
    if (true) {
        let x = 2;
        // 2
        console.log(x);
    }
    // 1
    console.log(x);
}

再舉一個例子:git

var a = 1;
var b = 2;

if (a === 1) {
    var a = 11;
    let b = 22;

    // 11
    console.log(a);
    // 22
    console.log(b);
}

// 11
console.log(a);
// 2
console.log(b);

另外,若是做用域位於程序的頂層,var會掛載到window上,而let不會:github

var a = 'a';
let b = 'b';

// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);

在相同的函數或塊做用域內從新聲明同一個變量會引起一個重複定義的SyntaxError函數

if (x) {
    let foo;
    // SyntaxError
    let foo;
}

letvar都會在聲明所在的做用域頂部被建立,這被稱爲變量提高,可是不一樣的是var的建立會伴隨着一個undefined值,在賦值以後纔會改變,而let沒有被賦值以前是不會被初始化的,若是在這期間引用let聲明的變量,會致使一個ReferenceError,直到初始化以前,該變量都處於暫存死區:this

function test() {
    // undefined
    console.log(bar);
    // ReferenceError
    console.log(foo);
    var bar = 1;
    let foo = 2;
}
test();

兩個複雜一點的例子:code

function test(){
    var foo = 33;
    if (true) {
        // ReferenceError
        let foo = (foo + 55);
    }
}
test();
function go(n) {
    // Object {a: [1,2,3]}
    console.log(n);

    // ReferenceError
    for (let n of n.a) {
        console.log(n);
    }
}
go({a: [1, 2, 3]});

const

const的基本做用是聲明一個做用域被限制在塊級的常量,其做用域和let同樣,基本使用也和let相似,可是const的特色是const聲明的值一經建立沒法被改變對象

使用const會建立一個值的只讀引用,這意味着const聲明的對象本省的引用是沒法被改變的,可是其屬性是能夠被改變的,由於改變其屬性並不會引發其引用的變化ip

下面給出const的一些特性的例子:作用域

基本使用:

const a = 'abc';

沒法被重複定義:

const a = 'abc';
// SyntaxError: Identifier 'a' has already been declared
const a = 'abc';

聲明時就必須賦值:

// SyntaxError: Missing initializer in const declaration
const a;

沒法被修改:

const a = 'a';
// TypeError: Assignment to constant variable
a = 'b';

塊級做用域:

if (true) {
    var a = 'a';
    const b = 'b';
    // a
    console.log(a);
    // b
    console.log(b);
}
// a
console.log(a);
// ReferenceError: not defined
console.log(b);

做用域在程序頂層時不會掛在window對象上:

var a = 'a';
const b = 'b';

// this -> window
// a
console.log(this.a);
// undefined
console.log(this.b);
// a
console.log(window.a);
// undefined
console.log(window.b);
相關文章
相關標籤/搜索