2016-09-12 19 views
4

這是谷歌瀏覽器版本53.0.2785.101(64位)的問題。我試着運行一個簡單的html文件,當我使用單詞'slot'時,它會拋出錯誤'slot.testFun不是函數'。是「插槽」在更新版本的ECMAScript中的保留字?

<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> 

在我們的代碼中沒有與此變量發生衝突。它只是瀏覽器,不允許在這個最新版本的變量名稱。

如果你使用任何其他名稱,除了單詞「空位」,它工作正常。

+1

你得到了什麼錯誤? –

+0

http://jsbin.com/gikonediru/1/edit?html,output - 我的測試代碼運行時沒有任何問題。 – Quentin

+1

「它拋出相同的錯誤」 - 與什麼相同的錯誤? – Quentin

回答

7

這不是ECMAScript的問題,這是一個DOM問題。

slot attribute都有相應的slot屬性,onclick attributes do stupid things with with所以你有效調用this.slot.testFun(),因爲它發現slot(默認爲是一個空字符串),它到達正確的範圍之前。

slot是一個新增加的DOM和支持slot是新的Chrome 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> 
+0

或使用'window.slot.testFun'在***屬性:p –

+2

@JaromandaX - 這也可以工作,但遠離最佳實踐。一般來說,最好避免全局。分離問題通常是一個好主意。 – Quentin

+1

但爲什麼只在最新版本的chrome中? 它在最新版本的Firefox中運行正常。我在更新Chrome瀏覽器後遇到此問題。 –

相關問題