gpt4 book ai didi

javascript - 什么时候使用 apply over call 因为我们现在有 spread 语法?

转载 作者:行者123 更新时间:2023-11-30 11:30:17 24 4
gpt4 key购买 nike

下面是applycall函数:

function.apply(context, [args])

function.call(context, arg1, arg2, ...)

我们知道 differenceapplycall 之间:

The difference is that apply lets you invoke the function with arguments as an array; call requires the parameters be listed explicitly.

现在我们有了扩展语法,我们可以很容易地使用 call 来做 apply 做的事情:

function.call(context, ...[args])

那么对于扩展语法,我们什么时候使用 apply 而不是 call?我很好奇 apply 函数是否可以退役。

最佳答案

考虑到 args 是类数组可迭代的,它是

function.call(context, ...args);
// vs
function.apply(context, args);

apply 更短。

apply 是原生的,因此比使用扩展参数的 call 更快。差异可能因浏览器版本而异,可以忽略不计(最近的 Chrome/V8)或非常大(Firefox、旧版 Chrome/V8)。视情况而定,此问题可被视为初步优化。

结果可能因浏览器版本而异,具体取决于是否存在针对传播语法和参数 的优化。以前类似数组的 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]);

关于javascript - 什么时候使用 apply over call 因为我们现在有 spread 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com