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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM