2013-09-26 325 views
4

我已經寫了一些代碼,一個按鈕添加到頁面:爲什麼window.location.reload需要封裝在一個函數(){}中?

var myButt = document.createElement('button'); 
myButt.onclick = window.location.reload; 
myButt.innerText = 'Reload'; 

document.body.appendChild(myButt); 

但它拋出一個錯誤:

TypeError: Type error

的函數進行包裝,解決了這個問題:

myButt.onclick = function(){ window.location.reload(); }; 

但我的問題是爲什麼前者不起作用?

執行air.trace(typeof(window.location.reload));輸出function

An answer來自高級代表用戶表示應該有可能。這絕對更簡潔。

我正在運行Adobe AIR 3.6(它運行Webkit),如果這有所作爲。

+1

「單獨使用'window.location.reload'不起作用,因爲當一個監聽器被執行時,該函數中this的值被設置爲它正在監聽的對象。 http://stackoverflow.com/questions/7213369/uncaught-typeerror-illegal-invocation-on-addeventlistener –

+2

函數只是一個函數和函數認爲它是一種方法之間存在細微的差異。不同之處在於'this'和'this'的值(通常)取決於函數的調用方式。 @KevinBeal:您可能想將該評論擴展爲答案。 –

+0

@KevinBeal將我的代碼更改爲'myButt.onclick = window.location.reload.bind(window。位置);'現在拋出這個錯誤:* TypeError:在具有無效原型屬性的對象上調用instanceof *(使用[MDN'bind'兼容性函數](https://developer.mozilla.org/en-US/docs)/Web/JavaScript/Reference/Global_Objects/Function/bind#Compatibility)) –

回答

2

this當使用它時,值不正確。
this原來是myButt當你需要它是window.location

爲了解決這個問題(嘿嘿),要麼把它包裝成你所做的,或新的this值綁定到它:

myButt.onclick = window.location.reload.bind(window.location); 

我只是測試這一點,它適用於Firefox的23.0。 1。




對於未來的參考,他用Function.prototype.bind兼容性代碼中發現here

用我上面的代碼中,他發現了錯誤

TypeError: instanceof called on an object with an invalid prototype property

爲了解決這個問題,我改變了兼容性代碼行18以下:

fNOP.prototype = this.prototype || {}; 

這是爲了使原型被設置爲空白對象,因爲window.location.reload自然沒有原型。

+0

正如我上面評論,該代碼拋出* TypeError:對具有無效原型屬性的對象調用instanceof * –

+0

好吧,我明白了。在該兼容性代碼的第18行上,將該行更改爲:'fNOP.prototype = this.prototype || {};' –

+0

這樣做的原因是因爲「window.location.reload」沒有原型屬性,所以在'.bind()'失敗。 –

相關問題