javascript
JS 异常: Uncaught RangeError: Maximum call stack size exceeded
遇到了這個js異常, 總是吧瀏覽器搞崩潰,這是什么原因呢?
開始我也只能想到死循環(huán), 也許是哪個條件判斷寫錯了,其實不是。經(jīng)過google,發(fā)現(xiàn)了一篇文章,內(nèi)容請看:
=================================================================
文章地址:?http://www.zizhujy.com/blog/post/2012/03/18/Uncaught-RangeError-Maximum-call-stack-size-exceeded.aspx
在此,非常感謝該文章作者的分享,本文完全轉(zhuǎn)載自上面鏈接,此處作為備份,個人查看使用。
一、問題:
今天在做網(wǎng)頁時突然碰到這樣的JavaScript錯誤:
Uncaught RangeError: Maximum call stack size exceeded
百思不得其解,千次調(diào)試找不到原因。
表面上看,是因為遞歸次數(shù)太多導致內(nèi)存被耗費太多,但是我的程序中,并沒有一處使用遞歸算法啊。
二、原因:
最終冷靜地思考了良久,終于發(fā)現(xiàn),問題的根源在于網(wǎng)頁中引用了兩個不同的JavaScript庫,而這兩個庫都對JavaScript原始對象的某些方法做了修改,從而導致出現(xiàn)了循環(huán)引用。具體說來,就是這么回事兒:
網(wǎng)頁H引用了js庫A和B,而A與B中對Math.pow方法都作了修改,如下圖所示:
?
如果對Math.pow()方法的修改只進行一次,那么是不會有問題的:先用Math.power存儲了Math.pow的原始版本,然后再用新的代碼替換Math.pow。
然而,在第二個庫中,又執(zhí)行到 Math.power = Math.pow時,那么Math.power就不再是保存Math.pow的原始版本了,
因為Math.pow已經(jīng)被第一個庫改成了新代碼,所以在Math.pow的新代碼中調(diào)用Math.power()時,本意是調(diào)用原始版本,而實際上,
卻是調(diào)用自己了。于是造成了循環(huán)!
?
三、解決方案:
在進行替換前加一行判斷代碼,避免重復使用相同的方法名。
四、備注:
看到這里,也許會有人感到奇怪,為什么要對原始的Math.pow()方法進行替換呢?這里的替換代碼似乎除了降低它的效率外,
什么也沒做。實際上,這里只是說明問題原因的一個示例,所以用了蠢代碼,但是簡單。為什么要對Math.pow()進行替換,
因為原始的Math.pow()有一個Bug,就是對負數(shù)求比如 1/3 次方,就會返回不正確的結果NaN。
轉(zhuǎn)載于:https://www.cnblogs.com/ipoplar/p/4528786.html
總結
以上是生活随笔為你收集整理的JS 异常: Uncaught RangeError: Maximum call stack size exceeded的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对象的软、弱、和虚引用
- 下一篇: 正式软件工作第一天————MVC、ext