概述
- 通过
var
定义的变量,它的作用域是在 function 或任何外部已经被声明的 function,是全域的 。 - 透過
let
定义的变量,它的作用域是在一個块(block)。
function varvslet() {
console.log(i); // i 是 undefined 的,因为变量提升
// console.log(j); // ReferenceError: j 没有被定义
for( var i = 0; i < 3; i++ ) {
console.log(i); // 0, 1, 2
};
console.log(i); // 3
// console.log(j); // ReferenceError: j 没有被定义
for( let j = 0; j < 3; j++ ) {
console.log(j);
};
console.log(i); // 3
// console.log(j); // ReferenceError: j 没有被定义
}
详细的区别
{
console.log(c); // undefined。因为变量提升
var c = 2;
}
{
console.log(b); // ReferenceError: b 没有被定义
let b = 3;
}
for (var i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i); // 输出 '5' 五次
}, 100);
}
使用 let
替换 var
// print 1, 2, 3, 4, 5
for (let i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i); // 输出 0, 1, 2, 3, 4
}, 100);
}
我们应该用 let
替代 var
嗎?
不是的,let
是新的块作用域。语法强调在 var
已经是区块作用域时時,let
应该替换 var
,否则请不要替换 var
。let
改善了在 JS 作用域的选项,而不是取代。var
对于变量依旧是有用的,可被用在整個 function 之中。
let
兼容性
Playground
更多信息