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了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,766評論 0 33
  • 1.函數參數的默認值 (1).基本用法 在ES6之前,不能直接為函數的參數指定默認值,只能采用變通的方法。
    趙然228閱讀 704評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,820評論 25 708
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,786評論 1 92
  • 對象的創建與銷毀 Item 1: 使用static工廠方法,而不是構造函數創建對象:僅僅是創建對象的方法,并非Fa...
    孫小磊閱讀 2,019評論 0 3