我正在尝试通过阅读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 = []
?
感谢。
答案 0 :(得分:2)
此行用于获取提供给该函数的任何额外参数。
然后将这些额外的参数传递给.apply
调用中的指定方法。
注意:JS 不检查函数的形式参数。省略的参数将为undefined
,并且(大部分)将忽略额外参数,但可通过arguments
伪数组获得。
我不确定为什么代码无法检查args.length
以查看是否要调用.apply
或.call
- 这看起来像是过早优化。
答案 1 :(得分:0)
仅仅因为该函数有两个参数并不意味着无法传入更多参数。在Javascript中,您可以传入任意数量的参数并通过arguments
访问它们。
此外,似乎这是一个泛型调用函数,它适用于任何方法(第二个函数参数)调用,因此不同的函数可以有不同数量的参数(或者没有)。