我对此做了很多研究,但似乎使用的方法不一致且多种多样。
以下是我过去使用的一些方法:
/* 1: */ typeof myFunc === 'function'
/* 2: */ myFunc.constructor === Function
/* 3: */ myFunc instanceof Function
作为我研究的一部分,我了解了一些知名图书馆是如何做到这一点的:
/* jQuery 1.2.6: */ !!fn && typeof fn != "string" && !fn.nodeName && fn.constructor != Array && /^[\s[]?function/.test( fn + "" )
/* jQuery 1.3b1: */ toString.call(obj) === "[object Function]"
/* Prototype 1.6: */ typeof object == "function"
/* YUI 2.6: */ typeof o === 'function'
我很惊讶有这么多不同的方法被使用,确定一个可接受的测试已经达成一致?我完全不知道 jQuery 1.2.6 版本的意图是什么,看起来有点 OTT...
那么,我的问题仍然存在,测试功能的最佳*方法是什么?
我也希望能深入了解上述某些方法,尤其是 jQuery 1.2.6 的方法。 (我能看到他们在做什么,这看起来很奇怪)
[*] 我所说的“最佳”是指最广泛接受的跨浏览器兼容方法。
编辑:是的,我知道之前已经讨论过,但我仍然希望就最有效的方法进行一些讨论。为什么有这么多不同的使用方法?
到目前为止,关于 SO 的讨论只提到了 typeof 运算符(大部分),但没有人暗示替代方法的有效性。
最佳答案
测试对象是否为函数的最佳方法是 typeof myFunc === 'function'
。如果您正在使用库,请使用该库的函数测试:jQuery.isFunction(myFunc)
。
当使用 typeof
时,可能被误报为函数。这是非常罕见的,但是有一个库可以消除这些不一致。 jQuery 解决了这些问题:
- Firefox 使用
typeof document.createElement("object")
报告功能 - Safari 报告功能
typeof document.body.childNodes
- 旧版本的 Firefox 将正则表达式报告为函数(在 3.0 中不是这种情况)。
- 一些 IE 内置的全局函数 (
alert
) 和一些节点方法 (getAttribute
) 被报告为“对象”类型。
使用 instanceof
而不是 typeof
可以避免其中的一些问题。例如,document.createElement("object") instanceof Function
在 Firefox 中为 false
。
第一个方法的诞生可以在the original ticket (#3618)的评论中查看.新方法来自changeset 5947似乎是 Resig 发明来解决 IE memory leaks .它可能更慢,但更小,更干净。
就工作方式而言,== 和 === 之间没有太大区别,但严格评估速度稍快,因此更受欢迎。
关于javascript - 在 JavaScript 中测试函数的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405164/