2012-10-17 81 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

我真的不记得问这是什么原因了。 –

相关问题