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