Fork me on GitHub

JS 异常:Uncaught RangeError: Maximum call stack size exceeded解析

  出现这种异常的原因是递归成了死循环或者代码中出现了死循环。

  检查代码发现没有明显的死循环,故上网搜索了下,发现这篇文章中的讲解非常有意思,认真理解了下文章中提到的代码。

// A
Math.power = Math.pow;

Math.pow = function(x,y) {
    if (x != 0) {
        return Math.power(x,y);
    } else {
        return 0;
    }
};

// B
Math.power = Math.pow;

Math.pow = function(x,y) {
    if (x != 0) {
        return Math.power(x,y);
    } else {
        return 0;
    }
};

  同时导入了A库和B库,就是将上述代码执行了一遍(替换pow方法功能走了两遍),在A处,Math.pow是原始方法,赋值给Math.power后,Math.pow变成新的function(x,y),但在B处又将function(x,y)赋值给Math.power,所以在第二个function(x,y)中调用的Math.power(x,y)实际调用的已经不是原始方法了,而是function(x,y)就是上面那个代码跟自己一样的function,这样导致了死循环。原文图文解说的非常详细。

  原文中还提到为什么JS库经常讲原始的Math.pow方法替换掉,见他的另一篇文章

 

posted @ 2015-10-21 19:32  瓘木  阅读(1874)  评论(0编辑  收藏  举报