【问题标题】:let statement in loop doesn't work as expected in IE循环中的 let 语句在 IE 中无法按预期工作
【发布时间】:2017-01-02 17:38:40
【问题描述】:

我正在尝试 ECMAScript 6 中的一些示例。与其他浏览器相比,它的工作方式不同。这在 Firefox 中返回 true,但在 IE 中返回 false。为什么这在 Internet Explorer 中的工作方式不同?

let callbacks = []
for (let i = 0; i <= 2; i++) {
  callbacks[i] = function () { console.log(i); return i * 2 }
}
console.log(callbacks[0]() === 0);
console.log(callbacks[1]() === 2);
console.log(callbacks[2]() === 4);

【问题讨论】:

  • IE 不完全支持 ES6。
  • 好的。我没有显示任何错误。但它返回的值是错误的。
  • 这是一个已知的 IE 问题,即 for(...) 初始化中的 let 无法正常工作。最简单的解决方法是将let j = i; 添加为{ } 块内的第一行,然后在您的函数中使用j - 这会产生您期望的结果。
  • 其实不只是IE。 目前没有单一的 javascript 引擎在浏览器或服务器中支持完整的 ES6 规范。如果你想使用 ES6 特性,要么只使用具有广泛浏览器支持的非常有限的子集,要么使用像 babel 这样的转译器。如果你想使用纯 js,请使用 ES5。 ES6 不能在生产环境中使用。对于爱好项目来说没问题,因为您只需要它在您自己的浏览器中运行,这样您就可以使用浏览器支持的小子集。但是对于真正的生产代码就不行了。
  • @slebetman Safari 10 有 100% 的支持。并且所有主流浏览器都有非常广泛的支持。如果客户使用 Chrome,为什么不应该在生产代码中使用 ES6?

标签: javascript internet-explorer ecmascript-6 let


【解决方案1】:

根据caniuse.comIE11种支持

let 变量不会单独绑定到 for 循环的每次迭代

【讨论】:

  • 值得注意的是,在 for 主体内创建的 let 变量似乎工作正常。只有在 for() 构造函数中创建的 let 变量似乎被破坏了。例如,这很好用:for(;;){let i;} 这坏了:for(let i;;){}
【解决方案2】:

对于寻找 IE11 快速解决方法的人,

let callbacks = []
for (let ie11i = 0; ie11i <= 2; ie11i++) {
  /*IE11 let bug bypass*/
  let i = ie11i;
  callbacks[i] = function () { console.log(i); return i * 2 }
}
console.log(callbacks[0]() === 0);
console.log(callbacks[1]() === 2);
console.log(callbacks[2]() === 4);
  • 将在 IE11 中与任何其他浏览器一样工作,只要您记得在循环中使用 i 而不是 ie11i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2015-04-10
    • 2020-05-06
    • 2021-04-13
    相关资源
    最近更新 更多