2012-10-17 34 views
5

我有物鏡typeof運算在IE <= 8,用於本地函數

可變物鏡可以是任何東西,我想檢測如果obj的函數。通常情況下,我會做

typeof obj === 'function' 

的問題是在IE < = 8時obj是一個本地函數(至少知道它window.open和window.alert發生)。在IE中typeof obj當對象是window.open時==='object'

有沒有一種可靠的方法來檢查window.open是否實際上是一個函數呢?

我看到的jQuery也沒有對這個

$.isFunction(window.open) => false //in IE 

這apperantly得到了jQuery的1.3或東西,不知道他們在此之前,如何測試它刪除。

補充: 一種方式似乎是叫

Function.prototype.apply.apply(window.open) 

如果這不會引發錯誤,則窗口打開是一個函數。如果你這樣做

Function.prototype.apply.apply({}) 

然後IE會拋出一個錯誤「Function expected」。但是,幾乎沒有一個很好的解決方案,以打開一個窗口來檢查變量的函數..

+2

所以這只是本機函數在IE返回typeof對象的問題,但用戶定義函數返回typeof函數?爲什麼只檢查本地函數是否存在,即window.open!== undefined'是不夠的?爲什麼你需要本地函數,這些函數被記錄爲這樣做?對不起,只是想了解你的思維過程。 – Scott

+0

看看@ 1.2及其對「函數」字面值的測試; http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.js –

+0

^@ AlexK。的相關代碼鏈接'return !! fn && typeof fn!=「string」&& !fn.nodeName && fn.constructor!= Array && /function/i.test(fn +「」);'其中fn是函數名稱 – Scott

回答

0

當涉及到本地瀏覽器的功能,特徵檢測應該是足夠了:

if (window.open) { 
    window.open(...) 
} 

如果有人將覆蓋本地函數,那麼不要使用他們的代碼。他們不應該這樣做,而且你在問問題。

沒有一定的背景下回答這個問題也很困難。您正在傳入obj並將其作爲函數調用。如果你傳遞多種數據類型,並根據類型做不同的事情,我會爭辯說,你不應該在這裏處理函數。由於瀏覽器怪癖,顯式創建一個函數來動態調用另一個函數,而不要進行錯誤檢查。

+0

我真的不記得問這是什麼原因了。 –

相關問題