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