此代码:
var arr = [];
arr.unshift.apply(arr, new Array(200000));
原因:未捕获RangeError:超出最大调用堆栈大小 (见http://jsfiddle.net/BnLxf/1/)
虽然这段代码运行良好:
var arr = [];
arr.unshift(new Array(200000));
知道为什么会这样吗?
答案 0 :(得分:4)
您的第一个示例与此相同:
arr.unshift(undefined, undefined, undefined, /* undefined 199,997 more times */);
您的第二个示例只是传递了unshift
一个参数,该参数是一个没有条目且length
为200000
的数组。
这是因为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));