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