【问题标题】:"can't create duplicate variable that shadows a global property"“无法创建隐藏全局属性的重复变量”
【发布时间】:2016-10-17 16:14:36
【问题描述】:

在 Safari 10 上出现此错误

当 const 的名称与页面上任何元素的 id 完全相同时发生。

const abc = document.querySelector("#abc"); //err
const abz = document.querySelector("#abc"); //no err
var abc = document.querySelector("#abc"); //no err

这是有原因的吗?
我知道您可以通过 window.abc 访问这些元素,这是部分原因吗?

测试:

<!doctype html>
<html><body>
<div id="alpha"></div>
<script>
    const alpha = document.querySelector('#alpha');
    console.log(alpha);
</script>
</body></html>

【问题讨论】:

  • Can't replicate (STP 10.1)
  • 错了,这就是 jsfiddle。试试生的?我会发布一个测试。
  • 刚试了STP,同样的错误。
  • 我可以用 HTML 复制,谢谢。如果您在 setTimeout 回调中运行 const alpha...,则不会发生错误。它看起来像 Safari 中的时间绑定错误。我想这就是为什么小提琴没有击中它的原因。
  • @joews 但是setTimeout 中的const 的作用域是超时后调用的回调函数,而不是全局作用域,所以它与这个问题并没有真正的关系。

标签: javascript safari ecmascript-6


【解决方案1】:

这显然是 Safari 在声明一个与所选 id 属性具有相同名称的 let/const 变量时遇到的问题。我和你一样用 const 声明了一些变量并得到了同样的错误。改为让,仍然得到它。改成 var 就可以了。

【讨论】:

  • 谢谢,您的回答解决了我今天的 Safari 问题。我想要那种比 IE 更讨厌 Safari 的状态!
  • 哇...这太可怕了...一年后仍然没有修复... safari 正在成为新的 IE 吗???
  • 我无话可说。只是……哇。快速搜索和替换 const 到 var 修复了它。
【解决方案2】:

这必须链接到this webkit bug

与此同时,您可以将const 替换为var,或者更改变量的名称(例如:_alpha)。

【讨论】:

    【解决方案3】:

    内森的回答是正确的。我没有使用 var,而是将我的 const 更改为与 id 不同的大小写。所以……

    const Abc = document.querySelector("#abc"); 
    

    仍然很老套,只是另一种选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 2016-10-25
      • 2017-05-31
      • 2022-01-28
      • 2017-11-12
      相关资源
      最近更新 更多