(typeof variable ===“function”)和jQuery.isFunction()之间有什么区别?

时间:2012-08-30 21:51:25

标签: javascript jquery function typeof

我一直使用(typeof variable === "function")而我偶然发现jQuery.isFunction()我想知道:

  1. typeof方法和jQuery的方法有什么区别?而且不仅仅是差异,而是
  2. 什么时候使用typeof方法是合适的,什么时候使用jQuery的方法是合适的?

5 个答案:

答案 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.prototypefunction() {}方法与字符串[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"

Here's an example.