5

我有一个变量 obj

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

typeof obj === 'function'

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

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

我看到 jQuery 在这方面也失败了

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

这显然在 jquery 1.3 或其他版本中被删除,不知道在此之前他们是如何测试它的。

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

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

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

Function.prototype.apply.apply({})

然后 IE 抛出错误“预期功能”。但是打开一个窗口来检查一个变量是否是一个函数并不是一个好的解决方案。

4

1 回答 1

0

说到原生浏览器功能,特征检测就足够了:

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

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

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

于 2014-10-29T15:50:25.097 回答