1. 程式人生 > >JavaScript var、let、const

JavaScript var、let、const

var申明的變數是有作用域的

如果一個變數在函式體內部申明,則該變數的作用域為整個函式體,在函式體外不可引用該變數:

'use strict';

function foo() {
    var x = 1;
    x = x + 1;
}
x = x + 2; // ReferenceError! 無法在函式體外引用變數x  

由於JavaScript的函式可以巢狀,此時,內部函式可以訪問外部函式定義的變數,反過來則不行:

'use strict';

function foo() {
    var x = 1;
    function bar() {
        var y = x + 1; // bar可以訪問foo的變數x!
    }
    var z = y + 1; // ReferenceError! foo不可以訪問bar的變數y!
}

 JavaScript的函式定義有個特點,它會先掃描整個函式體的語句,把所有申明的變數“提升”到函式頂部:

'use strict';

function foo() {
    var x = 'Hello, ' + y;
    console.log(x);
    var y = 'Bob';
}

foo();

 

區域性作用域

由於JavaScript的變數作用域實際上是函式內部,我們在for迴圈等語句塊中是無法定義具有區域性作用域的變數的:

'use strict';

function foo() {
    for (var i=0; i<100; i++) {
        //
    }
    i += 100; // 仍然可以引用變數i
}
let :區域性作用變數
為了解決塊級作用域,ES6引入了新的關鍵字let,用let替代var可以申明一個塊級作用域的變數:

'use strict';

function foo() {
    var sum = 0;
    for (let i=0; i<100; i++) {
        sum += i;
    }
    // SyntaxError:
    i += 1;
}

const:常量

常量

由於varlet申明的是變數,如果要申明一個常量,在ES6之前是不行的,我們通常用全部大寫的變數來表示“這是一個常量,不要修改它的值”:

var PI = 3.14;

ES6標準引入了新的關鍵字const來定義常量,constlet都具有塊級作用域:

'use strict';

const PI = 3.14;
PI = 3; // 某些瀏覽器不報錯,但是無效果! PI; // 3.14 

 詳細請參考:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014344993159773a464f34e1724700a6d5dd9e235ceb7c000