JS笔记:Maximum call stack size exceeded

今天碰到一个很逗的bug:

var arr1 = [];
var arr2 = new Array(300000);
Array.prototype.push.apply(arr1, arr2);

RangeError: Maximum call stack size exceeded

很多人容易把这个bug认为是recursion的问题,然而最简单的解释其实是你的函数参数太多,把call stack overflow掉了。apply的一个特征是会把第二个参数(array)里面的所有元素转换成参数。如:

var args = [1, 2, 3, 4];
foo.apply(this, args);

则会变成

foo(1, 2, 3, 4);

我们最初的例子中,arr2有30万个元素,这就自然会overflow我们的call stack了。

你可能感兴趣的:(JS笔记:Maximum call stack size exceeded)