【问题标题】:Safari - SyntaxError: Cannot declare a let variable twiceSafari - SyntaxError: 不能两次声明一个 let 变量
【发布时间】:2017-02-25 00:27:51
【问题描述】:

这是我以前从未见过的错误。

这是一个简单的复制:https://jsfiddle.net/jakelauer/qr0ysmst/3/

const x = myVar => {

  console.log(myVar);

  for(let myVar of [1,2,3]){
    console.log(myVar);
  }

};

x(10);

Chrome 中的输出:10123
在 Safari 中输出:SyntaxError: Cannot declare a let variable twice: 'myVar'.

想法?这是 Safari 中的错误吗?

编辑 - 值得注意的是,我不会故意这样做。我注意到它是因为我使用了 ASP.NET 捆绑和缩小系统,并且该系统做到了这一点(所以我的网站在 Safari 中崩溃了)

编辑 2 - 有趣的是,这适用于两种浏览器

let x = 10;

for(let x of [1,2,3])
{
    console.log(x);
}

https://jsfiddle.net/jakelauer/aw37pd2s/1/

【问题讨论】:

  • 我不确定这应该是否是一个错误,但我认为隐藏这样的参数是不好的编码。您应该在循环中调用 myVar 变量。
  • @Frxstrem 我当然同意 - 我永远不会故意这样做。我注意到它是因为我使用了 ASP.NET 捆绑和缩小系统,并且该系统做到了这一点(所以我的网站在 Safari 中崩溃了)。
  • 什么 Safari 版本?
  • @AndrewLi 我正在使用 10.0.3
  • 对我来说绝对像是一个 Safari 错误。循环中的let 应该在其自己的特定于迭代的环境中运行。

标签: javascript google-chrome safari ecmascript-6


【解决方案1】:

看起来这是一个 Safari 错误。我提交了错误报告。

【讨论】:

  • 杰克,你有没有找到任何解决方法让它在 Safari 中工作?我正在使用 .Net Bundling 并遇到相同的错误。我正在考虑检测浏览器并提供不同的捆绑包(针对所有人缩小,针对 Safari 不缩小)。
  • @yalpertem 我的解决方法是在出现问题的地方使用“var”而不是 let,或者只是重命名变量之一以避免它。
  • @jake 根据我上次测试的时间,这似乎是在过去 6-12 个月的某个时间修复的。在 Safari/Mac v11.1.2 和 iOS v11.4.1 附带的版本中,我在 Safari 中看到与 Chrome 相同的输出。我注意到这一点是因为我随机测试了一个在 Safari for iOS 中无法运行的应用程序(.NET MVC 包装器中的 Angular),现在它运行良好。
【解决方案2】:

提到了“影子”变量,但这种情况对我来说是个问题:

我在循环内重用key 并“隐藏”函数的参数。

我能够得到这两个错误: cannot declare a const variable twice 或者 cannot declare a let variable twice 通过更改 for 循环中的声明。

所以对我来说解决方法很简单 - 只需将循环的 const key 更改为 const k

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2018-05-28
    • 2018-09-18
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多