查看http://es6-features.org/#BlockScopedVariables
之间有什么区别
for (let i = 0; i < a.length; i++) { let x = a[i] … }
和
for (var i = 0; i < a.length; i++) { var x = a[i] … }
我在例子中理解他们将变量的声明移出块
var i, x, y
for (i = 0; i < a.length; i++)
{
x = a[i] …
}
但是有什么理由吗?为什么不在块内包含声明?这是一个不好的做法还是表现受到打击?
只是想了解。
感谢。
答案 0 :(得分:4)
块范围变量在其包含块之外根本不可用。这很容易通过一个例子来说明
for (let i = 0; i < 2; i++) console.info('inner loop i', i);
try {
console.info('after loop i', i);
} catch (e) {
console.error(e.message)
}
for (var j = 0; j < 2; j++) console.info('inner loop j', j);
console.info('after loop j', j);
答案 1 :(得分:2)
主要区别在于范围。
在ES6之前,你被困facet_wrap(~variable1, labeller = label_wrap_gen())
。使用var
时,变量是在封闭函数的范围内定义的。如果没有函数,则在全局对象上定义它们(通常为var
)。这使得名为的两个变量很难相同,但是在不同的范围内没有遇到冲突。
window
允许您将变量范围限定为封闭块,例如let
或if
循环,从而帮助解决此问题。
例如,一个常见问题是嵌套for
循环:
for
在上面的示例中,使用for(var i = 0; i < 4; i++){ // loop 1
console.log(i); // 0
for(var i = 0; i < 4; i++){ // loop 2
}
console.log(i); // 4 - since i was changed by loop 2, loop 1 is now unstable and will skip
}
代替了问题 - 每个let
变量都限定为它自己的块。
至于性能的任何差异,我不能说。如果有人知道,我很想知道。