这段代码:
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)
知道为什么会发生这种情况吗?
您的第一个示例相当于:
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调用期间使用的参数)。