'slot'是较新版ECMAScript中的保留字吗?

San*_*han 1 javascript google-chrome ecmascript-6

这是谷歌Chrome版本53.0.2785.101(64位)的问题.我尝试运行一个简单的html文件,当我使用'slot'这个词时,它会抛出错误'slot.testFun不是函数'.

<html>
<head>
    <title>TEST</title>
</head>
<body>
    <a href="#" onclick="slot.testFun();">Click Here</a>

    <script type="text/javascript">
        var slot = {
            testFun: function(){
                console.log('clicked');
            }
        }
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我们的代码中没有与此变量冲突.它只是浏览器,不允许在这个最新版本中使用变量名.

如果您使用除"slot"之外的任何其他名称,它可以正常工作.

Que*_*tin 7

这不是ECMAScript问题,而是DOM问题.

插槽属性都有相应的slot属性,onclick属性做愚蠢的事情with,所以你得到有效的调用this.slot.testFun(),因为它发现slot(默认为是一个空字符串),它到达正确的范围之前.

slot是DOM的新增功能,并且支持slotChrome 53中的新功能.它不会出现在Chrome 52中,也可能无法进入其他浏览器的最新版本.

解决方案:避免内在事件属性.用DOM绑定事件处理程序.这可以保护您免受他的冲突和未来的证明,从未来添加到DOM.

<a href="#">Click Here</a>

<script type="text/javascript">
    var slot = {
        testFun: function(){
            console.log('clicked');
        }
    }
    document.querySelector("a").addEventListener("click", slot.testFun);
</script>
Run Code Online (Sandbox Code Playgroud)

  • @JaromandaX - 那也行,但远离最佳实践.总的来说,最好避免使用Globals.关注点分离通常是一个好主意. (2认同)
  • @SantoshPradhan因为`slot`属性很新,只在最新版本中支持.FF与更常见的属性名称(例如`id`或`className`等)具有相同的问题 (2认同)