【问题标题】:Will webpack with babel es2015 preset fix closure issues on IE 11?带有 babel es2015 预设的 webpack 会修复 IE 11 上的关闭问题吗?
【发布时间】:2017-11-21 01:03:25
【问题描述】:

如果我使用 let 关键字编写一个 for 循环来声明我的循环变量,然后将该变量传递给一个

for(let x=0;x<5;x++){
    setTimeout(function(){console.log(x);},1000);
}

调用,它在 IE 11 中不起作用,因为 IE 11 不支持 ES2015。但我可以在 Typescript 中编写此代码,编译并使用 Babel 输出到所谓的 IE11 兼容代码。 Babel 会成功识别并解决这个问题吗?

我意识到,一旦我设置好环境,测试自己就相对简单,但我觉得这可能只是 Babel 能做什么和不能做什么的冰山一角。只是想知道是否有人知道这是否或如何工作,以及是否有一些与闭包相关的东西是 Babel 无法转换的。提前致谢。 - -编辑 - - 将变量“x”传递给函数实际上会产生一个未定义的错误,所以我想我在那里打破了其他一些规则。但是,在删除匿名函数参数以在“x”上创建适当的闭包后,我发现 Babel 转换没有正确记录值 0、1、2、3... 在这一点上,我想我不同意那些谁说它确实正确地转换了这种情况。或者我完全错过了一些东西。 (感谢第一个回复 babeljs.io/repl 链接的人!非常酷。)

【问题讨论】:

  • 您无需设置环境即可发现这一点。您可以将有问题的代码直接放入 Babel REPL:babeljs.io/repl。我会为你做,但你没有向我们展示你正在谈论的实际代码。
  • 迈克回答这个问题绝对值得称赞。请参阅下面的评论。再次感谢迈克。

标签: javascript typescript internet-explorer-11 babeljs webpack-2


【解决方案1】:

确保您使用的是env aka es2015 预设。

babelrc:

{
   "presets": ["env"]
}

【讨论】:

  • 这不是答案,只是评论。
  • 谢谢。我使用了上面 JLRishe 的建议,然后去 babeljs.io/repl 测试代码。转换在 IE 11 中运行,但产生不同的结果。原始 ES2015 代码产生 0,1,2,3,4,5,而转换后的代码产生 6,6,6,6,6,6
  • @Wade 尽管我认为这很明显,但我只是尝试了生成的代码 - 请参阅 Mike C 的链接示例 - 在 IE 11 中 - 它可以工作。由于_loop 函数捕获了x,因此符合预期。
  • @Wade 是的,我在 Chrome 上按原样运行代码并得到正确的输出。我还在 IE11 上运行了 Babel 输出并得到了正确的输出。 Babel 没有进行人工文本替换。你可以看到它正确地生成了一个函数来保持let施加的范围规则。
  • 哇,谢谢。它让我回去检查我的原始代码,我发现我做错了什么。我将 x 传递给匿名函数并在 ES 和移植函数上都未定义,因为......嗯......两者都是无效的大声笑。在通过删除函数参数正确地创建闭包并使用 Babel 重新转换后,它确实做到了 Magic!哇,我印象深刻。谢谢,迈克。现在将您的答案发布为完整的答案,以便您获得报酬!
猜你喜欢
  • 2019-03-10
  • 2017-03-04
  • 2017-10-14
  • 2015-04-27
  • 2021-02-12
  • 2023-03-08
  • 1970-01-01
  • 2018-02-06
  • 2017-06-20
相关资源
最近更新 更多