es6 Block-Scoped变量的不同之处是什么?

时间:2016-11-16 02:31:13

标签: javascript

查看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] … 
}

但是有什么理由吗?为什么不在块内包含声明?这是一个不好的做法还是表现受到打击?

只是想了解。

感谢。

2 个答案:

答案 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允许您将变量范围限定为封闭块,例如letif循环,从而帮助解决此问题。

例如,一个常见问题是嵌套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变量都限定为它自己的块。

至于性能的任何差异,我不能说。如果有人知道,我很想知道。