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,769评论 0 33
  • 1.函数参数的默认值 (1).基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
    赵然228阅读 704评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,242评论 25 708
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,796评论 1 92
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,021评论 0 3