对于本机函数,IE <= 8中的typeof

Mar*_*sen 5 javascript internet-explorer

我有一个变量obj

obj可以是任何东西,我想检测obj是否是一个函数.通常我会这样做

typeof obj === 'function'
Run Code Online (Sandbox Code Playgroud)

当obj是本机函数时,问题出现在IE <= 8中(至少知道它发生在window.open和window.alert中).在IE类型的obj中,当对象是window.open ==='object'时

有没有可靠的方法来检查window.open是否实际上是一个函数?

我看到jQuery也失败了

$.isFunction(window.open) => false //in IE
Run Code Online (Sandbox Code Playgroud)

这显然是在jquery 1.3或其他东西中删除的,不知道他们之前是如何测试的.

补充: 一种方式似乎是打电话

Function.prototype.apply.apply(window.open)
Run Code Online (Sandbox Code Playgroud)

如果这不会引发错误,那么window open是一个函数.如果你这样做

Function.prototype.apply.apply({})
Run Code Online (Sandbox Code Playgroud)

然后IE抛出一​​个错误"功能预期".但是打开一个窗口来检查一个变量是否是一个函数几乎不是一个好的解决方案.

Gre*_*rdt 1

当涉及到本机浏览器功能时,功能检测应该足够了:

if (window.open) {
    window.open(...)
}
Run Code Online (Sandbox Code Playgroud)

如果有人覆盖本机函数,则不要使用他们的代码。他们不应该这样做,而你却在自找麻烦。

如果没有上下文,也很难回答这个问题。obj您将其作为函数传递并调用。如果您传递多种数据类型并根据类型执行不同的操作,我认为您不应该在这里传递函数。由于浏览器的怪癖,请显式创建一个函数来动态调用另一个函数,并且不进行错误检查。