【问题标题】:Different variable scoping using "let" keyword between browsers在浏览器之间使用“let”关键字的不同变量范围
【发布时间】:2016-06-29 16:56:02
【问题描述】:

下面的代码,如果你在Chrome和Firefox中执行它会返回不同的行为。

var obj = {
  key: 'val',
  key2: 'val'
};

function x(b) {
  setTimeout(b, 1000);
}

var keys = Object.keys(obj);
for (let ki of keys) {
  x(function() {
    console.log(ki); // Prints key2 key2 in Firefox, key key2 in Chrome
  });
}

为什么会这样?这是一个错误? Chrome返回的正确输出应该是计算规格吗?

【问题讨论】:

  • Firefox 的实现尚未完成。 kangax.github.io/compat-table/es6/#test-let 同时,在循环内创建一个本地 let 变量并使用它。 let kki = ki;
  • 它在 Firefox 中看起来像是一个不完整的实现。对于循环的每次迭代,应该有一个完全唯一的变量ki,而 Firefox 还没有这样做。它为所有迭代共享相同的变量。
  • 谢谢你们! =)
  • 不客气。请注意,为该let 创建了一个范围,但该范围基本上包含了整个for-of 语句。所以就像 {let ki; for (ki of keys) {...} } Firefox 在规范之前有 let,而规范最终没有匹配它们的实现。

标签: javascript function loops scope


【解决方案1】:

我会说这是一个错误。您可以尝试在启用 Babel 的 jsBin 上运行它,您会在 FireFox 中看到 Chrome 的行为:

http://jsbin.com/nadikatari/edit?html,js,console,output

听起来 FireFox 还没有实现 let。如果你现在想使用 ES6,你真的应该使用 Babel 转译到 ES5。

【讨论】:

  • 感谢您的意见和 jsBin!我会在 6 分钟内接受你的回答。
猜你喜欢
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2016-02-16
  • 2011-01-22
相关资源
最近更新 更多