有過js開發經驗的人都知道,js是極難定位錯誤的,總是報一個缺少對象等錯誤,報出錯誤的頁面和行數又不對,很難作問題定位。在這裡我將自己定位JS錯誤的方法分享給大家。
dom的window對象有一個方法是onerror它可以捕獲瀏覽器的js錯誤下面是一個問題定位函數:
window.onerror = function(sMessage,sUrl,sLine){ } //window.onerror有三個參數,sMessage是錯誤資訊:一般情況下都過於簡單,sUrl是錯誤地址:如果引用的JS發生錯誤,這裡是不準的,sLine是錯誤行數:如果是當前頁的錯誤,行數是準的,如果不是當前頁面的錯誤,則行數往往相錯一行。IE報出的就是三個錯誤 |
(構客網原創)
這些資訊當然遠遠不夠,其實我們可以通過其它方式拿到更多資訊,譬如錯誤的函數呼叫堆疊。這裡給出一個範例程式碼如下:
window.onerror = function(sMessage,sUrl,sLine){ var str = ""; str += " 錯誤資訊:" + sMessage + "/n"; str += " 錯誤地址:" + sUrl + "/n"; str += " 錯誤行數:" + sLine + "/n"; str += "<=========呼叫堆疊=========>/n"; var func = window.onerror.caller; var index = 0; while(func!=null){ str += "第" + index + "個函數:" + func + "/n"; str += "第" + index + "個函數:參數表:" for(var i=0;i<func.arguments.length;i++){ str += func.arguments[i] + ","; } str += "/n===================/n"; func = func.caller; index++; } alert(str); } |
這裡拿到了函數的呼叫堆疊,以及每個函數的參數值,所以可以更好地定位錯誤。我們一測試一下:
<script> window.onerror = function(sMessage,sUrl,sLine){ var str = ""; str += " 錯誤資訊:" + sMessage + "/n"; str += " 錯誤地址:" + sUrl + "/n"; str += " 錯誤行數:" + sLine + "/n"; str += "<=========呼叫堆疊=========>/n"; var func = window.onerror.caller; var index = 0; while(func!=null){ str += "第" + index + "個函數:" + func + "/n"; str += "第" + index + "個函數:參數表:" for(var i=0;i<func.arguments.length;i++){ str += func.arguments[i] + ","; } str += "/n===================/n"; func = func.caller; index++; } alert(str); } function test(){ test1("a","b"); } function test1(a,b){ alert(ab); } test(); </script> |
彈出的錯誤資訊為:
有了這些資訊,相信可以很快定位到錯誤了吧。