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

时间:2014-02-10 14:03:51

标签: javascript

此代码:

var arr = [];
arr.unshift.apply(arr, new Array(200000));

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

虽然这段代码运行良好:

var arr = [];
arr.unshift(new Array(200000));

知道为什么会这样吗?

2 个答案:

答案 0 :(得分:4)

您的第一个示例与此相同:

 arr.unshift(undefined, undefined, undefined, /* undefined 199,997 more times */);

您的第二个示例只是传递了unshift 一个参数,该参数是一个没有条目且length200000的数组。

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

当被要求调用具有200,000个离散参数的函数时,JavaScript引擎会窒息,这并不奇怪。 (如果有效,我也不会感到惊讶。)

如果你想将数组作为一个参数传递,但你想使用apply的东西 - 比如,使用call

arr.unshift.call(arr, new Array(200000));

call将你提供的参数传递给你的参数(第一个参数除外,这是在调用期间用作this的内容)。

答案 1 :(得分:0)

Function#apply方法需要一个数组作为第二个参数。你应该用括号括起new Array(200000)

var arr = [];
arr.unshift.apply(arr, [new Array(200000)]);

正如克里斯所说,你也可以调用方法.call而不是.apply

var arr = [];
arr.unshift.call(arr, new Array(200000));