0

我正在尝试通过阅读 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到应该是)。我查看了 JS 参考并得出结论,它基本上将 args 初始化为一个空数组。[array, method]arguments[2]null

那为什么不干脆var args = []呢?

谢谢。

4

2 回答 2

2

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

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

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

我不确定为什么代码会费心检查args.length是否调用.apply.call- 它看起来像过早的优化。

于 2012-10-30T14:53:38.800 回答
0

仅仅因为函数有两个参数并不意味着不能传入更多参数。在 Javascript 中,您可以传入任意数量的参数并通过arguments.

此外,这似乎是一个通用调用函数,旨在处理任何方法(第二个函数参数)调用,因此不同的函数可以有不同数量的参数(或没有参数)。

于 2012-10-30T14:54:22.710 回答