var和ES6的let
来源自:http://www.jstips.co/zh_cn/javascript/keyword-var-vs-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语法。否则请在这里确认你的浏览器是否支持。

浙公网安备 33010602011771号