今天碰到一个很逗的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了。