为什么Array.prototype.slice(参数,2)而不是初始化为空数组?

时间:2012-10-30 14:51:10

标签: javascript fabricjs

我正在尝试通过阅读Fabric.js的源代码来学习Javascript。

在文件util/lang_array.js中有一个如下所示的方法:

    var slice = Array.prototype.slice;

    function invoke(array, method) {
        var args = slice.call(arguments, 2), result = [ ];

        for (var i = 0, len = array.length; i < len; i++) {
            result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);
        }
        return result;
    }

我不理解陈述var args = slice.call(arguments, 2)。令我困惑的特殊部分是传递2作为第二个参数(考虑arguments[array, method],然后arguments[2]应为null)。我查看了JS参考,得出的结论是它基本上将args初始化为一个空数组。

那么为什么不简单地var args = []

感谢。

2 个答案:

答案 0 :(得分:2)

此行用于获取提供给该函数的任何额外参数。

然后将这些额外的参数传递给.apply调用中的指定方法。

注意:JS 检查函数的形式参数。省略的参数将为undefined,并且(大部分)将忽略额外参数,但可通过arguments伪数组获得。

我不确定为什么代码无法检查args.length以查看是否要调用.apply.call - 这看起来像是过早优化。

答案 1 :(得分:0)

仅仅因为该函数有两个参数并不意味着无法传入更多参数。在Javascript中,您可以传入任意数量的参数并通过arguments访问它们。

此外,似乎这是一个泛型调用函数,它适用于任何方法(第二个函数参数)调用,因此不同的函数可以有不同数量的参数(或者没有)。