JavaScript 中 ES6 var VS let

Posted by cl9000 on March 16, 2020

人生的价值,并不是用时间,而是用深度去衡量的。 ——<列夫·托尔斯泰>

概述

用定义的变量的作用域 var是函数作用域,或者在任何函数(全局)之外声明。
用定义的变量的作用域 let是块作用域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function varvslet() {
console.log(i); // i is undefined due to hoisting
// console.log(j); // ReferenceError: j is not defined

for( var i = 0; i < 3; i++ ) {
console.log(i); // 0, 1, 2
};

console.log(i); // 3
// console.log(j); // ReferenceError: j is not defined

for( let j = 0; j < 3; j++ ) {
console.log(j);
};

console.log(i); // 3
// console.log(j); // ReferenceError: j is not defined
}

差异明细

变量范围

let不会提升到它们出现在其中的块的整个范围。相反,var可以如下提升。

1
2
3
4
5
6
7
8
9
{
console.log(c); // undefined. Due to hoisting
var c = 2;
}

{
console.log(b); // ReferenceError: b is not defined
let b = 3;
}

闭环

let 在循环中可以将其重新绑定到循环的每个迭代中,并确保从上一个循环迭代结束时重新为其分配值,因此可以将其用于避免闭包问题。

1
2
3
4
5
for (var i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i); // output '5' 5 times
}, 100);
}

替换 varlet

1
2
3
4
5
6
// print 1, 2, 3, 4, 5
for (let i = 0; i < 5; ++i) {
setTimeout(function () {
console.log(i); // output 0, 1, 2, 3, 4
}, 100);
}

参考

关注【公众号】,了解更多。



支付宝打赏 微信打赏

赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!