儘管嘗試使用別名和函數包裝方法,但對document.getElementById 進行別名化還是失敗在Firefox、Chrome 甚至調試視窗中。 Firefox 中會拋出錯誤,而 Chrome 中會出現「非法呼叫」。此外,此操作在 Internet Explorer 8 中有效。
經過深入分析,問題在於 JavaScript 函數鬆散地附加到物件並與作用域互動的方式。
呼叫 JavaScript 函數時,解釋器會指派一個作用域並將其傳遞給函數。如果函數使用 this 來引用作用域,則 this 的值將是傳入的作用域。
但是,您可以使用 apply 方法手動指定作用域,覆寫由解釋器。
將 document.getElementById 別名為 $ 會遇到錯誤,因為當您呼叫 $('someElement') 時,範圍設定為視窗對象,而不是文件目的。因此,如果 getElementById 的實作期望範圍是文檔,則函數將會失敗。
要解決此問題,您可以使用 $.apply(document, [' someElement']) 明確設定文件物件的範圍。
Internet Explorer 中別名的意外成功可能歸因於在 IE 中,window物件就相當於document物件。如果是這種情況,別名應該會在 IE 中正常運作。
為了進一步說明這個問題,請考慮以下Person 函數:
function Person(birthDate) { this.birthDate = birthDate; this.getAge = function() { return new Date().getFullYear() - this.birthDate.getFullYear(); }; this.getAgeSmarter = function() { return this.getAge(); }; this.getAgeSmartest = function() { return (this.constructor == Person ? this : self).getAge(); }; }
與兩個創建了Person 類別的實例,yogi 和anotherYogi,以下是對應的輸出:
以上是為什麼 JavaScript 函數的別名會在某些瀏覽器中導致錯誤,而在其他瀏覽器中卻不會?的詳細內容。更多資訊請關注PHP中文網其他相關文章!