2

有一堆 jQuery 方法允许您重新排序或省略特定参数。例如:

$('#box').animate({top: 100}, 2000, "linear", function(){alert("done");});

与以下内容完全相同:

$('#box').animate({top: 100}, 2000, function(){alert("done");});

jQuery 如何在不将关联数组传递给单个参数的情况下配置它们的方法以实现这种灵活性?

他们会检查每个参数的数据类型并根据结果进行分配吗?这会为每种方法增加大量开销吗?

4

4 回答 4

0

查看github上的jQuery.animate() 函数,我看到他们正在使用 2nd、3rd 和 4th 参数调用 jQuery.speed()。速度函数定义得更远一些,并使用参数进行一些类型检查。

来自 effects.js 的代码片段:

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
    };
    ...
};
于 2012-12-20T01:12:31.493 回答
0

简短的回答:是的,他们通常会测试 if $.isFunction$.isObject $.isArray等,并根据它们的类型来移动参数。这只有在您有一个预定义的原型列表时才有效。(在 animate 的情况下,第二个参数可以是对象(选项)或数值(持续时间)。

于 2012-12-20T01:14:39.407 回答
0

确定 jQuery 使用if和声明elseswitch必须首先检查每个参数,是函数、布尔值、字符串、整数或对象值

在它可以运行之前。

于 2012-12-20T01:17:23.280 回答
0

我已经使用开关模拟了我自己的解决方案。

// Allocate passed arguments to settings based on type
for( var i = 0; i <= arguments.length; i++ ) {
    var arg = arguments[i];
    switch ( typeof arg ) {
        case "function":
            settings.action = arg;
            break;
        case "boolean":
            settings.runOnLoad = arg;
            break;
        case "number":
            settings.duration = arg;
            break;
    }
}
于 2012-12-26T23:04:12.700 回答