我一直使用(typeof variable === "function")
而我偶然发现jQuery.isFunction()
我想知道:
答案 0 :(得分:10)
几乎没什么区别,除了使用jQuery稍慢。请参阅源代码:
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
},
调用一个调用另一个函数的函数来确定与你展示的完全相同的东西:P
在这种情况下,jQuery实际上没有任何优势[或者以这种方式,90%的库用例]。查看Vanilla-JS并查看其中的一些功能:P
TLDR:不要为此使用jQuery ......或其他任何东西。
这是一个基准测试,向您展示Vanilla JS比jQuery快约93%:http://jsperf.com/jquery-isfunction-vs-vanilla-is-function。
答案 1 :(得分:3)
<击> 没有区别。 jQuery使用相同的概念:
// ...
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
}
<强>更新强>
深入挖掘后,我发现jQuery的isFunction
方法正在将toString
上的Object.prototype
链function() {}
方法与字符串[object Function]
进行比较。这就是它与前一个例子的不同之处,以及它比typeof
慢的原因。
答案 2 :(得分:2)
isFunction的jQuery源代码是
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
},
type: function( obj ) {
return obj == null ?
String( obj ) :
class2type[ core_toString.call(obj) ] || "object";
},
//...
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "),
function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
core_toString = Object.prototype.toString,
因此当且仅当在其参数上调用jQuery.isFunction
返回Object.prototype.toString.call
时,[object Function]
才返回true。
答案 3 :(得分:2)
通常,您可以使用此测试来测试JS对象是否正常运行:
(typeof fn === 'function')
但是,这并不总是有效(IE8):
typeof alert => 'object'
typeof document.createElement('input').getAttribute => 'object'
在jQuery 1.4内部之前,他们使用相同的检查,但现在他们已经修复了它。因此,为了确保传递的对象是一个可以调用的函数,只需使用$ .isFunction方法:
$.isFunction(function() {}) => true
$.isFunction(alert) => true
$.isFunction(document.createElement('input').getAttribute) => true
从此博客复制:http://nuald.blogspot.co.uk/2012/07/why-jqueryisfunction.html
答案 4 :(得分:1)
不同之处在于JQuery调用与以下内容等效的东西并检查“Function”字符串标记:
var toString = Object.prototype.toString;
var func = function(){};
console.log(toString.call(func)); // "returns [object Function]"
而typof,只返回“function”:
var fType = typeof func;
console.log(fType); // returns "function"