JavaScript var、let、const
阿新 • • 發佈:2018-11-25
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:常量
常量
由於var
和let
申明的是變數,如果要申明一個常量,在ES6之前是不行的,我們通常用全部大寫的變數來表示“這是一個常量,不要修改它的值”:
var PI = 3.14;
ES6標準引入了新的關鍵字const
來定義常量,const
與let
都具有塊級作用域:
'use strict';
const PI = 3.14;
PI = 3; // 某些瀏覽器不報錯,但是無效果! PI; // 3.14
詳細請參考:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014344993159773a464f34e1724700a6d5dd9e235ceb7c000