使用 apply() 调用 array.unshift 会导致“超出最大调用堆栈大小”

Ser*_*iuB 1 javascript

这段代码:

var arr = [];
arr.unshift.apply(arr, new Array(200000));
Run Code Online (Sandbox Code Playgroud)

原因:未捕获的 RangeError:超出最大调用堆栈大小(请参阅 http://jsfiddle.net/BnLxf/1/

虽然这段代码工作正常:

var arr = [];
arr.unshift(new Array(200000));
Run Code Online (Sandbox Code Playgroud)

知道为什么会发生这种情况吗?

T.J*_*der 5

您的第一个示例相当于:

 arr.unshift(undefined, undefined, undefined, /* undefined 199,997 more times */);
Run Code Online (Sandbox Code Playgroud)

您的第二个示例仅传递unshift 一个参数,该参数是一个没有条目和 a 的length数组200000

这是因为 的目的Function#apply是调用具有给定this参数值的函数,然后将这些参数作为离散(单独)参数传递到目标函数。

当 JavaScript 引擎被要求调用具有 200,000 个离散参数的函数时,它会卡住,这并不完全令人惊讶。(如果它有效的话我也不会感到惊讶。)

如果您想将数组作为单个参数传递,但您想使用apply类似的东西,请使用call

arr.unshift.call(arr, new Array(200000));
Run Code Online (Sandbox Code Playgroud)

call传递您提供的参数与您提供给它们的参数完全相同(第一个参数除外,这是在this调用期间使用的参数)。