在let
与const
ES6let
允许您声明一个变量,该变量的范围仅限于块(局部变量)。主要区别在于var
变量的范围是整个封闭函数:
if (true) {
var foo = 42; // scope globally
}
console.log(foo); // 42
该let
范围
if (true) {
let foo = 42; // scoped in block
}
console.log(foo); // ReferenceError: bar is not defined
使用var
的功能范围是一样的使用let
:
function bar() {
var foo = 42; // scoped in function
}
console.log(foo); // ReferenceError: bar is not defined
的let
关键字附加的变量声明到任何的阻止它被包含在范围内。
申报令
let
和之间的另一个区别var
是声明/初始化顺序。访问由let
早于其声明声明的变量会导致ReferenceError。
console.log(a); // undefined
console.log(b); // ReferenceError: b is not defined
var a = 1;
let b = 2;
使用 const
另一方面,使用 ES6const
很像使用let
,但是一旦赋值,就无法更改。使用const
作为一个不变的值,以防止变量意外重新分配:
const num = 42;
try {
num = 99;
} catch(err) {
console.log(err);
// TypeError: invalid assignment to const `number'
}
num; // 42
使用const
给变量赋值是在现实生活中(如冷冻温度)不变。JavaScriptconst
不是要创建不可更改的值,它与值无关,const
是为了防止将另一个值重新分配给变量并使变量成为只读的。但是,值始终可以更改:
const arr = [0, 1, 2];
arr[3] = 3; // [0, 1, 2, 3]
要防止值更改,请使用Object.freeze()
:
let arr = Object.freeze([0, 1, 2]);
arr[0] = 5;
arr; // [0, 1, 2]
使用let
带For
圈
let
真正闪耀的一个特殊情况是在for
循环的标题中:
for (let i = 0; i <= 5; i++) {
console.log(i);
}
// 0 1 2 3 4 5
console.log(i); // ReferenceError, great! i is not global