我已经对此进行了相当多的研究,但似乎使用的方法不一致且多种多样.
以下是我过去使用过的一些方法:
/* 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 myFunc === 'function'
.如果您使用的是库,请使用该库的功能测试:jQuery.isFunction(myFunc)
.
在使用时,事物可能被误报为功能typeof
.这是非常罕见的,但是库可以消除这些不一致性.jQuery解决这些问题:
Firefox报告功能 typeof document.createElement("object")
Safari报告功能 typeof document.body.childNodes
较旧版本的Firefox将正则表达式报告为函数(3.0中不是这种情况).
据报道,一些构建在全局函数(alert
)和一些节点方法(getAttribute
)中的IE 是"对象"类型.
使用instanceof
而不是typeof
绕过其中一些.例如, document.createElement("object") instanceof Function
是false
在Firefox.
您可以在原始票证的注释中查看第一种方法的诞生(#3618).新方法来自变更集5947,似乎是Resig发明的,用于解决IE内存泄漏问题.它可能更慢,但更小,更清洁.
这里的==和===之间没有太大的区别,就事情的工作方式而言,严格的评估是如此快一点,因而是首选.