为什么回调函数在javascript中由参数[arguments.length-1]表示?

时间:2014-01-06 05:30:36

标签: javascript

我从somehwere复制了一段代码,它基本上用于扩展JQuery的hide方法并将其扩展为调用回调

但我不清楚该方法是如何运作的。

       js.executeScript("window.webdrivercallback = function(){};" +

            "var _oldhide = $.fn.hide;" +
            "$.fn.hide = function(speed, callback) {" +
            "    var retThis = _oldhide.apply(this,arguments);" +
            "    window.webdrivercallback.apply();" +
            "    return retThis;" +
            "};"
    );

另外在selenium webdriver代码中我们必须添加一段代码,如:

js.executeAsyncScript("window.webdrivercallback = arguments[arguments.length - 1];");

我无法理解如何通过传递arguments[arguments.length-1]之类的参数来创建一个javascript函数webdrivercallback。这个语句有什么意义?什么是arguments以及值传递到arguments字段的位置,因为我找不到将值传递给arguments字段的单个位置。 有人可以帮我理解这段代码。

1 个答案:

答案 0 :(得分:1)

在这种情况下,最后一个参数是一个函数,arguments是一个数组(很好,非常类似于数组),它包含发送给函数的所有参数。 因此,arguments[arguments.length-1]将始终是发送给函数的最后一个参数。

例如,考虑一下:

function someFunction(param1, param2, param3){
    //arguments would have here: [param1, param2, param3]
    //so arguments[arguments.length-1] is the last param: param3
    var callback = arguments[arguments.length-1];   //This is what looks strange to you
    alert(typeof callback); //alerts 'function' if last param is well.. a function;
    callback();  //Execute the callback as a proof!   
}

所以,我们称之为:

someFunction('a', 'b', function(){
    alert("callback executed!!");
});

如您所见,它会警告“function”,因为最后一个参数是一个函数。因此,它可以被分配为没有问题的回调。

另外,不要忘记我们可以使用比定义的参数更多或更少的参数调用函数,因此arguments[arguments.length-1]是一个总是得到最后一个参数的技巧。

希望很清楚。

来自玻利维亚拉巴斯的欢呼声