3

我只是玩了一下animate()方法。

.animate(属性[,持续时间] [,缓动] [,完成])

我知道我不必将所有参数传递给 javascript 中的函数。但我想知道的是jquery如何计算出function(){ }指的是回调函数,它实际上是第4个参数,而不是缓动字符串(即第3个)?

$('div').animate({ height: '10px' }, 100, function(){ });
4

6 回答 6

3

有简单的测试来检查类型:

源代码animate调用speed):

jQuery.speed = function( speed, easing, fn ) {
    var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
        complete: fn || !fn && easing ||
            jQuery.isFunction( speed ) && speed,
        duration: speed,
        easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
    };

...

isFunction: function( obj ) {
        return jQuery.type(obj) === "function";
    },

...

type: function( obj ) {
        return obj == null ?
            String( obj ) :
            class2type[ core_toString.call(obj) ] || "object";
    },

...

core_toString = Object.prototype.toString

...

jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

所以基本上它检查的Object.prototype.toString.call(fn)"[object Function]".

于 2012-10-05T13:23:39.500 回答
1

jQuery查看参数的类型发现,easing参数是string类型,而complete参数是function类型。

请参阅.animate()的 api,了解每个参数的类型。

例子:

function test(first, second, third) {
   if (typeof third == 'string') {
       //third is the easing function
   } else if (typeof third == 'function') {
       //third is the callback function
   }
}
于 2012-10-05T13:22:23.353 回答
1

检查参数的typeofarguments.length

于 2012-10-05T13:22:46.903 回答
1

可以检查参数的类型。

像:

if (typeof easing == 'function') {
  complete= easing;
  easing = 'some default value'; 
} else {
  // ...
}
于 2012-10-05T13:23:17.767 回答
0

我的猜测是使用 typeof() 来查看参数是否是一个函数,但如果你真的想知道,请查看它们的来源:https ://github.com/jquery/jquery

于 2012-10-05T13:23:09.730 回答
0

大概:

function test(){};
typeof test // 'function'
于 2012-10-05T13:23:41.867 回答