var和ES6的let
概述
- 通过
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 没有被定义
}
详细的区别
-
变量提升
let
不會被提升到整个块的作用域。相比之下,var
可以被提升。
{
console.log(c); // undefined。因为变量提升
var c = 2;
}
{
console.log(b); // ReferenceError: b 没有被定义
let b = 3;
}
-
循环中的闭包
let
在每次循环可以重新被 bind,确保在它之前结束的循环被重新赋值,所以在闭包中它被用來避免一些问题。
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
兼容性
-
在 server 端,比如 Node.js,你现在可以安心的使用
let
。 -
在 client 端,通过 transpiler(比如 Traceur),可以安心的使用
let
语法。否则请在这里确认你的浏览器是否支持。
Playground
更多信息
MEET THE NEW JSTIPS BOOK
You no longer need 10+ years of experience to get your dream job.
Use the 100 answers in this short book to boost your confidence and skills to ace the interviews at your favorite companies like Twitter, Google and Netflix.
GET THE BOOK NOW
MEET THE NEW JSTIPS BOOK
The book to ace the JavaScript Interview.
A short book with 100 answers designed to boost your knowledge and help you ace the technical interview within a few days.
GET THE BOOK NOW