JQuery 未知异常: Maximum call stack size exceeded

转载 2015年07月07日 17:53:15
 

未知异常: Maximum call stack size exceeded

以下内容为转载的,今天在搞前端时遇到的同样问题,看了下面解释后,找到了问题所在,如下所言,是某个语句被无限调用导致的。可在前台控制台查到。
一、问题:

今天在做网页时突然碰到这样的JavaScript错误:

Uncaught RangeError: Maximum call stack size exceeded

百思不得其解,千次调试找不到原因。

表面上看,是因为递归次数太多导致内存被耗费太多,但是我的程序中,并没有一处使用递归算法啊。

二、原因:

最终冷静地思考了良久,终于发现,问题的根源在于网页中引用了两个不同的JavaScript库,而这两个库都对JavaScript原始对象的某些方法做了修改,从而导致出现了循环引用。具体说来,就是这么回事儿:

网页H引用了js库A和B,而A与B中对Math.pow方法都作了修改,如下图所示:

Maximum call stack size exceeded

如果对Math.pow()方法的修改只进行一次,那么是不会有问题的:先用Math.power存储了Math.pow的原始版本,然后再用新的代码替换Math.pow。然而,在第二个库中,又执行到 Math.power = Math.pow时,那么Math.power就不再是保存Math.pow的原始版本了,因为Math.pow已经被第一个库改成了新代码,所以在Math.pow的新代码中调用Math.power()时,本意是调用原始版本,而实际上,却是调用自己了。于是造成了循环!

Uncaught RangeError: Maximum call stack size exceeded

三、解决方案:

在进行替换前加一行判断代码,避免重复使用相同的方法名。

1
2
3
4
5
6
7
8
9
10
11
12
13
if (Math.power == null) {
        // 此判断非常重要,如果Math.power 已经在别的地方定义过了,再次这样重新定义,会导致循环引用,从而引发
        // Uncaught RangeError: Maximum call stack size exceeded 错误
    Math.power = Math.pow;
 
    Math.pow = function(x, y) {
        if(x != 0) {
            return Math.pow(x, y);
        else {
            return 0;
        }
    }
// end if

四、备注:

看到这里,也许会有人感到奇怪,为什么要对原始的Math.pow()方法进行替换呢?这里的替换代码似乎除了降低它的效率外,什么也没做。实际上,这里只是说明问题原因的一个示例,所以用了蠢代码,但是简单。为什么要对Math.pow()进行替换,因为原始的Math.pow()有一个Bug,就是对负数求比如 1/3 次方,就会返回不正确的结果NaN。详细讨论见:

对JavaScript的Math.pow()函数的一个修正

相关文章推荐

js中"Maximum call stack size exceeded"解决方法

>Uncaught RangeError: Maximum call stack size exceeded错误直译过来就是“栈溢出”,出现这个错误的原因是因为我进行了递归运算,但是忘记添加判断条件,...

未知异常: Maximum call stack size exceeded

一、问题: 今天在做网页时突然碰到这样的JavaScript错误: Uncaught RangeError: Maximum call stack size exceeded 百思不...

一个页面使用两次timepicker.js引起的Maximum call stack size exceeded问题解决办法及bug修复

可能大多数人用过,jquery ui组件中,有个叫datepicker的,用来接收用户输入的日期,截图如下:             这个控件的缺点是不能选择时分秒,如项目中需要的输入时分秒这样的...

jquery trigger()事件报错,Uncaught RangeError: Maximum call stack size exceeded。

起初,用trigger()是想隐藏input file,然后点击div的时候等于点击input file,便遇到了这个问题,这个问题的代码如下,请自行引入jquery。   aaaaa...
  • Yiright
  • Yiright
  • 2017年01月11日 11:37
  • 1287

vue-router.esm.js:1697 RangeError: Maximum call stack size exceeded

vue-router.esm.js:1697 RangeError: Maximum call stack size exceeded

JQuery 错误Maximum call stack size exceeded

昨天 遇到一个问题当控件id和 jquery ajax请求里面的 data变量名重名的时候 回出现这个问题...

Uncaught RangeError: Maximum call stack size exceeded解决思路

今天突然碰到这样的JavaScript错误:Uncaught RangeError: Maximum call stack size exceeded 这个翻译过来就是堆栈溢出了。 1、原...

async 报‘Maximum call stack size exceeded’错误

在使用async的 eachLimit(arr, limit, iterator, callback) 方法时,当数组arr比较大时会报错:Maximum call stack size exceed...

node最新版本安装导致的Maximum call stack size exceeded npm

node最新版本安装导致的Maximum call stack size exceeded npm为了赶时髦,使用最新的es7功能,博主小手一抖就更新了自己的node版本(写该博客的时候是8.0.0版...
  • GISlv
  • GISlv
  • 2017年06月30日 16:40
  • 2488

js中Uncaught RangeError: Maximum call stack size exceeded问题

今天在做一个递归函数时,突然控制台给我报了一个Maximum call stack size exceeded这样的错误,我很纳闷,思路很正确,但是为什么会报这样的错误呢。 我们今天就聊聊这个错是怎...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JQuery 未知异常: Maximum call stack size exceeded
举报原因:
原因补充:

(最多只允许输入30个字)