以下是apply
和call
个功能:
function.apply(context, [args])
function.call(context, arg1, arg2, ...)
我们知道apply
和call
之间的difference:
区别在于apply允许你调用函数 参数作为数组; call需要列出参数 明确。
现在我们已经传播了语法,我们可以轻松使用call
执行apply
所做的事情:
function.call(context, ...[args])
因此,对于扩展语法,我们何时使用apply
而不是call
?我很好奇apply
函数是否可以退役。
答案 0 :(得分:3)
考虑到args
是类似于数组的迭代,它是
function.call(context, ...args);
// vs
function.apply(context, args);
apply
更短。
apply
是原生的,因此比传播参数的call
更快。浏览器版本之间的差异可能会有所不同(最近的Chrome / V8)或者是激烈的(Firefox,旧的Chrome / V8)。根据具体情况,这种担忧可能被视为初步优化。
浏览器版本之间的结果可能不同,具体取决于扩展语法和arguments
的优化的存在。以前类似数组的arguments
可能会导致apply
中的优化,特别是在V8中。在支持扩展语法的现代引擎中,这不再是一个问题。
如果参数是类似数组但不可迭代,则会出现实际差异。例如,arguments
变为可迭代not so long ago,...arguments
在旧浏览器版本中将失败,即使它们支持扩展语法。因此apply
更可取,因为call
需要安全设备:
function.call(context, ...Array.from(arguments));
// vs
function.apply(context, arguments);
另一方面,如果参数可迭代但不是类似数组,则存在实际差异。由于apply
接受数组喜欢,因此call
会更好,而且可能更快:
function.call(context, ...set);
// vs
function.apply(context, [...set]);