javaScript代碼飄紅報錯看不懂?讀完這篇文章再試試
一、本文將會出現以下英語詞匯
assignment[əˈsaɪnmənt] 賦值;分配assignment [əˈsaɪnmənt] 分配;任務call [kɔːl] 調用caught [kɔːt] 捕獲;接住;截住;攔住;constructor [kənˈstrʌktə(r)] 構造器cannot [ˈkænɒt] 不是catch [kætʃ] 接住;抓住constant[ˈkɒnstənt] 常量defined [dɪˈfaɪnd] 定義error [ˈerə(r)] 錯誤; 差錯; 謬誤;exceeded [ɪkˈsiːdɪd] 超過function [ˈfʌŋkʃn] 函數finally [ˈfaɪnəli] 最終;最后invalid [ɪnˈvælɪd] 不承認的; 無效的initializer [ɪˈnɪʃəˌlaɪzə] 初始值left-hand [ˈleft hænd] 左邊的Maximum [ˈmæksɪməm] 最大property [ˈprɒpəti] 屬性;財產stack [stæk] 堆棧shorthand [ˈʃɔːthænd]syntax [ˈsɪntæks] 句法; 句法規則; 語構;side [saɪd] 一邊;一側;reference [ˈrefrəns] 談及; 涉及;range [reɪndʒ] 范圍;界限;區間; 類; 種;token [ˈtəʊkən] 令牌;標記try [traɪ] 嘗試throw [θrəʊ] 投;擲;拋;扔;摔;丟;猛推;使勁撞Uncaught 未捕獲unexpected [ˌʌnɪkˈspektɪd] 出乎意料的;始料不及的undefined [ˌʌndɪˈfaɪnd] 未定義variable[ˈveəriəbl] 變量
二、帶你領略JS常見的四種Error類型
1、ReferenceError(引用錯誤):使用了未定義的變量。錯誤之前的代碼會執行,之后代碼不會執行。
// 1、變量未定義便直接使用console.log(my);// 報錯:Uncaught ReferenceError: my is not defined// 翻譯:my未定義 // 2、將變量賦值給一個無法被賦值的東東Math.random()=1;// 報錯:Uncaught ReferenceError: Invalid left-hand side in assignment// 翻譯:左側的賦值無效
2、TypeError(類型錯誤):變量或參數不是預期類型,或調用對象不存在的屬性方法。錯誤之前的代碼會執行,之后代碼不會執行。
// 1、變量不是預期類型,比如對字符串、布爾值、數值等原始類型的值使用new命令。let userName = new 'zhangpeiyue';// 報錯:Uncaught TypeError: 'zhangpeiyue' is not a constructor// 翻譯:'zhangpeiyue' 不是一個構造函數。new 操作符后應該是一個構造函數 // 2、變量不是預期類型,比如變量被作為函數來使用let userName = 'zhangpeiyue';console.log(userName())// 報錯:Uncaught TypeError: userName is not a function// 翻譯:userName 不是一個函數 // 3、對象的屬性或方法不存在const obj = undefined;// 為null也會報錯console.log(obj.userName);// 報錯:Uncaught TypeError: Cannot read property ’userName’ of undefined// 翻譯:undefined的環境下無法讀取屬性“userName”
3、RangeError(范圍錯誤):數據值不在JS所允許的范圍內。錯誤之前的代碼會執行,之后代碼不會執行。
// 1、遞歸函數未設置跳出的條件function run(){ run();}run();// 報錯:Uncaught RangeError: Maximum call stack size exceeded// 翻譯:超出最大調用堆棧大小。原因函數一直調用,直到達到調用堆棧限制。 // 2、無效的數組長度,應該是個正整數const arr =new Array(-1);// 報錯:Uncaught RangeError: Invalid array length// 翻譯:無效的數組長度
4、SyntaxError(語法錯誤):即寫的代碼不符合js編碼規則。我們可以根據后面的信息提示去修改錯誤,當然,語法錯誤,瀏覽器會直接報錯,整個代碼都不會執行。
// 1、程序錯誤,比如寫錯,或者缺少 , ) ; } 這些符號。const obj = {;// 報錯:Uncaught SyntaxError: Unexpected token ’;’// 翻譯:';'該標記有些出乎意料。 // 2、變量定義不合法let 8userName = 'zhangpeiyue';// 報錯:Uncaught SyntaxError: Invalid or unexpected token// 翻譯:定義的變量標記無效 // 3、對象屬性賦值語法錯誤const obj = { userName = 'zhangpeiyue'}// 報錯:Uncaught SyntaxError: Invalid shorthand property initializer// 翻譯:對象屬性初始值無效。原因:對象中屬性與其對應的值之間使用“=”// 語法錯誤有很多,在此就不一一列舉了
三、通過try…catch處理Error
1、被try包裹的代碼塊一旦出現Error,會將Error傳遞給catch并運行catch代碼塊。不會影響后續代碼運行。
try{ console.log(userName);}catch (err) { // ReferenceError: userName is not defined console.log(err);}console.log('我還會繼續運行哦!!')
2、出現SyntaxError(語法錯誤),不會被拋出。
try{ // Uncaught SyntaxError: Invalid or unexpected token const 8userName = 'zhangpeiyue';}catch (err) { console.log(err);}console.log('我不會繼續運行了!!')
3、通過 throw new Error 拋出錯誤
try{ throw new Error('出現異常了');}catch (err) { // 錯誤相關信息 console.log(err.message);// 出現異常了 // 函數調用棧記錄信息 console.log(err.stack);// Error: 出現異常了}console.log('我還會繼續運行哦!!')
4、不管有沒有異常,finally中的代碼都會在try和catch之后執行
try{ throw new Error('出現異常了');}catch (err) { // 錯誤相關信息 console.log(err.message);// 出現異常了 // 函數調用棧記錄信息 console.log(err.stack);// Error: 出現異常了}finally { // 不管有沒有異常,我都會執行。哪怕你有return,我也會執行! console.log('不管有沒有異常,我都會執行。哪怕你有return,我也會執行!')}console.log('我還會繼續運行哦!!')
5、總結
只要不發生語法錯誤,程序即可不中斷執行。 使用try包裹的代碼,即使不出錯,效率也比不用try包裹的代碼低。 在try中,盡量少的包含可能出錯的代碼。 無法提前預知錯誤類型的錯誤,必須用try catch捕獲。 finally可以省略。try{ //可能發生錯誤的代碼}catch(err){ //只有發生錯誤時才執行的代碼}finally{ //無論是否出錯,肯定都要執行的代碼}
最后,代碼出現錯誤并不可怕,真正可怕的是你的業務及代碼邏輯出現問題才是真正災難的開始!
到此這篇關于javaScript代碼飄紅報錯看不懂?讀完這篇文章再試試的文章就介紹到這了,更多相關javaScript 代碼報錯內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章:
