2017-09-19 63 views
3

我的Chrome瀏覽器最近已經更新到61.0.3163.79版本,我注意到一個奇怪的行爲與下面的JavaScript代碼:衝突的JavaScript變量名61.0.3163.79

<!doctype html> 
 
<html lang="fr"> 
 
    <head> 
 
     <script> 
 
      var scroll = { 
 
       myFunction : function() {console.log('myFunction called');} 
 
      } 
 
     
 
      scroll.myFunction(); /* first call */ 
 
      window.scroll.myFunction(); /* second call */ 
 
     </script> 
 
    </head> 
 
    <body> 
 
     <button onclick="scroll.myFunction()">test1</button> <!-- third call --> 
 
     <button onclick="window.scroll.myFunction()">test2</button> <!-- fourth call --> 
 
    </body> 
 
</html>

這代碼覆蓋window.scroll函數(不要問我爲什麼,這是遺留代碼)。在控制檯結果是運行時和「測試1」和「測試2」按鈕被點擊時,以下幾點:

myFunction called 
myFunction called 
Uncaught TypeError: scroll.myFunction is not a function at HTMLButtonElement.onclick 
myFunction called 

在早期的Chrome版本,並在MSIE 11,點擊「測試1時,函數調用工作正常「和‘TEST2’按鈕,導致在控制檯以下消息:

myFunction called 
myFunction called 
myFunction called 
myFunction called 

現在的問題:

  • 爲什麼瀏覽器的Chrome從早期.0.3163.79行爲不同版本和其他瀏覽器?
  • 這是一個錯誤?
  • 將這種行爲被未來的版本和其他瀏覽器被採用?

請注意,在此期間,我更改了變量名稱以避免與瀏覽器本機特性的名稱衝突。

+1

這是不使用全局變量的一個很好的例子.. :) ..它看起來像按鈕具有滾動性質,也許最近增加。因此,this.scroll = TheButton.scroll ..將您的代碼更改爲window.scroll.myFunction,它會再次工作。 – Keith

+0

@Keith:我編輯了代碼以反映建議的變體。請將您的評論推薦給答案。 –

回答

1

<button onclick="scroll.myFunction()">test1</button>

這裏的問題是,滾動窗口對象對你之後,。

這樣看來,在最新版本的Chrome瀏覽器,他們已經增加了一個渦旋式壓縮機方法實際按鈕。所以你最終打電話的是button.scroll.myFunction,而不是window.scroll.myFunction

瀏覽器廠商可以隨時添加任何命名的方法,因此,即使你創造了一個全球名爲myScroll,在理論上有什麼能夠阻止瀏覽器廠商加入myScroll的按鈕元素。顯然這不太可能,但要注意。

,以避免這些問題的排序,最好的辦法是始終有你的範圍控制,從不依靠全局變量,除非這些全局傳遞到一個範圍,。 Javascript關閉真的幫助這裏。不幸的是,在您的示例中,您使用了HTML事件綁定,而不是代碼綁定,因此無法實現。