使用无序/可选参数的jQuery方法

时间:2012-12-20 01:01:35

标签: jquery arguments

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

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

与以下内容完全相同:

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

jQuery如何配置他们的方法以允许这种灵活性而不将关联数组传递给单个参数?

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

4 个答案:

答案 0 :(得分:0)

查看jQuery.animate() function on github我看到他们正在使用第2,第3和第4个参数调用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
    };
    ...
};

答案 1 :(得分:0)

简短回答:是的,他们通常会测试$.isFunction$.isObject $.isArray等,并根据它们的类型移动参数。这真的只有在你有预期的predefined list of prototypes时才有效。 (在动画的情况下,第二个参数可以是对象(选项)或数值(持续时间)。

答案 2 :(得分:0)

当然jQuery使用ifelseswitch语句,必须首先检查每个参数, 是函数,布尔值,字符串,整数或对象值

才能运行。

答案 3 :(得分: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;
    }
}