我正在尝试通过阅读 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 = []
呢?
谢谢。
最佳答案
这一行用于获取提供给函数的任何额外参数。
然后,这些额外的参数将传递给 .apply
调用中的指定方法。
注意:JS不检查函数的形式参数。省略的参数将是未定义
,额外的参数将(大部分)被忽略,但可以通过arguments
伪数组获得。
我不确定为什么代码要费心检查 args.length
以查看是否调用 .apply
或 .call
- 它看起来像过早优化。
关于javascript - 为什么 Array.prototype.slice(arguments, 2) 而不是初始化为空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13141594/