JavaScript 開發中常見錯誤解決小總結

2020-12-12 Nodejs開發

作者:前端小混混 來源:前端先鋒

身為一名前端打工人,當然是經驗越多,在排查錯誤時會更容易。道理都懂,但仍然會在遇到問題時會不知道怎樣著手。

Chrome DevTools 中常見錯誤排查

Chrome 開發者工具的 Console 相當好用,最常使用的不外乎是通過 console.log展示出變量或運算的結果,如果符合預期則皆大歡喜。

但是一旦出現紅字幸災樂禍的告訴我們「你出錯了!」,這對我們來說無疑是一種挫折,在不知如何著手解決錯誤的時,只能反覆地檢查自己的代碼,看看是不是有什麼奇怪的地方,有時就算停在了錯誤地方也往往不知是什麼意思,會因此花費大量的時間。

本文就來介紹在 Chrome 開發者工具中常見的錯誤反饋及排除技巧,讓你不再為了滿屏幕的紅字感到挫折,更能從中學習如何快速搜尋錯誤代碼。

注意:JavaScript 是屬於同步的程式語言,如果出現錯誤就會造成後面的代碼無法運行,當紅字沒有解決時,都有可能造成接下來的代碼行錯誤或是無法繼續運行。

錯誤類型:SyntaxError

SyntaxError 類型的錯誤通常是語法錯誤,遇到這種錯誤時建議通過你所用的 IDE 排查,比如 VSCode 能夠直接跳出這類型的錯誤提示。

如下圖,VSCode 用紅色波浪線提示 family 對象有錯誤,當出現錯誤時會建議不要只檢查當前行,錯誤可能會存在於上下文中(有可能跨多行的錯誤),這個例子中仔細檢查可以發現在'小明'後面少了一個逗號。

排查重點:使用主流的 IDE 例如 "VSCode" 進行排查

Uncaught SyntaxError: Unexpected identifier

var person = { name: '小明' family: { name: '小明家' } }

語法解析錯誤,因為在對象結構中缺少一個逗號,除了通過在 VSCode 中查看外,也可以直接通過 Chrome Console 切換到 Source 頁面查看錯誤行,並檢查此行的上下文中是否存在語法錯誤。

Uncaught SyntaxError: Unexpected end of input

function fn() { console.log('這是一個函數'); console.log(fn);

語法解析錯誤:未預期的結束,這個例子中缺少結尾的大括號 },在編寫代碼時儘可能的維持正確的鎖緊,將代碼排列整齊之後更容易找到錯誤。

Uncaught SyntaxError: Unexpected token '}'

if (name) console.log('立即執行函數') };

語法解析錯誤:未預期的符號 },代碼結尾多了一個 } 符號導致環境運行錯誤,這個錯誤的排查方法與上面相同,儘可能將代碼排整齊並維持首尾符號的一致。

除此之外再推薦一個 VSCode 工具,可以為你的首尾標籤加上對應的色彩:

https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer

例子:代碼中成對的 {} 都會以相同的顏色展示。

Uncaught SyntaxError: Identifier 'a' has already been declared

let a; let a;

語法解析錯誤:識別符號(在這裡指的是變量)已經被聲明,應該避免重複生命同一個變量,在 ES6 都禁止用 let、const 對變量進行重複聲明,直接排除即可。

錯誤類型:ReferenceError

ReferenceError 這類錯誤通常是指找不到引用,當出現這類錯誤時在 IDE 中不一定會提示現錯誤(除非安裝了 Linter),所以在代碼的運行階段才會看到這類錯誤。

排查重點:

通過 Chrome 的提示改正在 JavaScript 開發環境中安裝 ESLintReferenceError: a is not defined

ReferenceError: a is not defined

引用錯誤:由於變量 a 未定義,所以在使用這個變量時會出現未定義的提示,只要先定義好這個變量即可。

還有另一種很常見的情況,當引用外部包時出現 「包名 + is not defined」,這種情況通常是外部資源沒有被正確載入,應該確保該資源被正確的引入。

下面的例子就是因為 jQuery 沒有正確導入而導致的。

Uncaught ReferenceError: $ is not defined

錯誤類型:TypeError

TypeError 是類型上的錯誤,同樣 IDE 也不會預先提示有錯誤,必須在執行時才會看到,這類型的錯誤通常是以下幾種:

試圖獲取 undefined、null 的屬性嘗試調用非函式變量或表達式(例如: 'text'())排查重點:在獲取變量前先確認其當前的數據類型及結構

Uncaught TypeError: Cannot read property 'a' of undefined

var a; console.log(a.a);

說明:在這個變量的值中無法找到其特定的屬性,例如在 undefined、null 的值上是找不到其它屬性的,如果無法確認該變量是否為 undefined,可以把代碼改成這樣:

if (typeof a !== 'undefined') { console.log(a.a); }

Uncaught TypeError: console.log(...) is not a function

console.log('a') (function() { console.log('立即執行函數') })()

說明:這代碼看起來是立即執行函數的錯誤,但是卻出現了 console.log(...) is not a function。這個錯誤主要是因為缺少了分號。

當遇到這類錯誤時只要在兩者之間補上分號即可。

console.log('a'); (function() { console.log('立即執行函數') })()

錯誤類型:RangeError

這是創建了超過長度上限的數組或執行了無法退出的遞歸函數所造成的錯誤,遇到這類問題需要重新檢查代碼的邏輯,是否消耗了過多的資源(內存或CPU資源)。

排查重點:需要重新檢查邏輯,如果有必要可先刪除部分代碼,先找出錯誤的片段後再進行除錯。

Uncaught RangeError: Maximum call stack size exceeded

(function a() { a(); })();

說明:在函數調用時會產生一個函數調用棧,如果在遞歸的過程中超過上限則會產生錯誤。

這類錯誤也很常見,卻不容易找到出錯的原因,其主要原因是在遞歸時超過了環境的限制(使用框架時也很常見),如果遇到這錯誤建議改寫當前調用函數的方式。

總結

當 Chrome Console 報錯時要保持淡定,在編碼的過程中出現錯誤是很常見的,所謂的大佬與新手之間的區別之一就是遇到錯誤時的經驗,遇到錯誤時搞不清楚沒關係,這都是經驗的累積。只要積累足夠了,再遇到相同的問題時就能自然而然地輕鬆面對了。

相關焦點

  • JavaScript 開發中常見錯誤排查
    ,這對我們來說無疑是一種挫折,在不知如何著手解決錯誤的時,只能反覆地檢查自己的代碼,看看是不是有什麼奇怪的地方,有時就算停在了錯誤地方也往往不知是什麼意思,會因此花費大量的時間。本文就來介紹在 Chrome 開發者工具中常見的錯誤反饋及排除技巧,讓你不再為了滿屏幕的紅字感到挫折,更能從中學習如何快速搜尋錯誤代碼。
  • 10 種 JavaScript 中常見的錯誤
    前言查看了數千個項目後,發現了 10 個最常見的 JavaScript 錯誤。我們會告訴你什麼原因導致了這些錯誤,以及如何防止這些錯誤發生。如果你能夠避免落入這些 「陷阱」,你將會成為一個更好的開發者。
  • 網頁技巧:妥善處理JavaScript中的錯誤
    Web開發的不連貫性留下了許多錯誤能夠發生並確實已經發生的地方。解決的關鍵在於處理任何不可預見的(或可預見的錯誤),來控制用戶的體驗。利用JavaScript,就有多種技術和語言特色可以用來正確地解決任何問題。事事檢查在開始之前檢查一切是一個好的編程習慣,也就是說,你應該在利用它們之前,檢查對象、方法調用等的有效性。
  • 解決JavaScript錯誤從未如此簡單!
    檢測,診斷和銷毀影響客戶的JavaScript錯誤。藉助Raygun提供的智能JavaScript錯誤跟蹤軟體,您可以提醒您影響用戶的問題,第二個問題發生。JavaScript錯誤往往會很嘈雜,並引發大量無用的信息。Raygun可以幫助您消除這些噪音,並專注於影響應用程式用戶數量最多的問題。
  • 【第1199期】10 種最常見的 Javascript 錯誤
    數據才是王道,我們收集並分析了出現頻次排前 10 的 JavaScript 錯誤。 Rollbar 會收集每個項目的所有錯誤,並總結每個錯誤發生的次數。我們通過根據 「指紋」(rollbar 用到的一種算法,詳見:https://rollbar.com/docs/grouping-algorithm/)對錯誤進行分組。
  • 10 種最常見的 Javascript 錯誤
    我們會告訴你什麼原因導致了這些錯誤,以及如何防止這些錯誤發生。如果你能夠避免落入這些 「陷阱」,你將會成為一個更好的開發者。數據才是王道,我們收集並分析了出現頻次排前 10 的 JavaScript 錯誤。 Rollbar 會收集每個項目的所有錯誤,並總結每個錯誤發生的次數。
  • 如何避免 JavaScript 開發者常犯的 9 個錯誤?
    但很多初學者都會犯一些常見的錯誤。在這篇文章中,我們將介紹 9 個常見的錯誤(或者說不好的實踐)以及它們的解決方案,幫助你成為更好的 JavaScript 開發者。將賦值操作符(=)和相等操作符(==,===)混為一談正如名稱所示,賦值操作符是用來給變量賦值的。
  • Django常見錯誤信息匯總及解決方案
    小編我前面已經寫過一篇關於Django常見錯誤的文章了,見Django常見錯誤總結: 細數我們一起走過的大坑。
  • 在WEB大型項目中10大常見的JavaScript錯誤
    Uncaught TypeError: Cannot read property如果你是一個JavaScript開發人員,你可能已經看到過這個錯誤。當你讀取屬性或在未定義對象上調用方法時,Chrome中就會發生這種情況。你可以在Chrome開發者控制臺中輕鬆進行測試。
  • 10大最常見的JavaScript錯誤
    為了便於閱讀,每個錯誤都被縮短了,讓我們更深入地研究每一個問題,以確定是什麼導致了這些問題,以及如何避免產生這些問題。1. Uncaught TypeError: Cannot read property如果你是一個JavaScript開發人員,你可能已經看到過這個錯誤。
  • 10大常見JavaScript代碼錯誤淺析,看看你遇到幾個?
    前言如今,javascript是一門非常火的語言,尤其是作為前端開發,你必須對它了如指掌。我們在開發調試的時候,它也經常會報錯,下面我們就來具體看看常見的10個錯誤。發生這個錯誤的原因有很多,其中最為常見的是,在渲染 UI 組件時沒有正確初始化狀態。
  • 10個常見錯誤報告原因及解決方案
    但是,與此同時,賣家也需要面對eBay發送的系統錯誤報告,當賣家未在特定步驟中遵循準則時,eBay會發送一些系統錯誤報告。下文是你在eBay上銷售或使用ebay集成應用程式時可能會遇到的所有eBay錯誤報告,以及它們的原因和解決方案,以避免在銷售過程中遇到錯誤報告。
  • React Native 開發日常、常見問題總結及解決
    大公司基本都用上了;方法:可以關注 阿里 相關的 技術公眾號,你能知道目前 熱門技術及乾貨;個人感覺前沿技術基本在 阿里系;跟著大公司的步伐學習不會錯、不會脫軌連結:Flutter 學習姿勢可點擊之前文章 一星期從入門到實際開發經驗分享及總結
  • javascript流程語句
    但不可能所有的問題都能用順序執行方式就能解決,總會有一些跳轉。2.採用結構化的程序設計,可以大大提高開發程序的速度、提高程序的可讀性、程序運行的速度和效率。3.結構化程序是由若干個基本結構組合而成,每一個結構可以包含若干條語句和其它基本結構。
  • JavaScript 數組操作函數總結
    js中數組操作函數還是非常多的,今天忽然想到來總結一下,也算是溫故而知新吧。
  • Java、C/C++、JavaScript、PHP、Python,到底用來開發什麼?
    所以,今天小編先來給大家普及一下Java、C/C++、JavaScript、PHP、Python到底分別是用來開發什麼的?總結:Java:網頁, 企業級開發,普通應用軟,遊戲後臺。C/C++理論上說可以做任何開發,只要有合適的硬體驅動和API,特點是效率高,基本上是編譯語言裡面效率最高的。除非你的系統中連C/C++編譯器都不具備。某些系統當中C++編譯器是不具備的,但是C一般都具備。
  • 5種用於前端開發的JavaScript替代方案
    與JavaScript不同,Dart是一種靜態類型的語言,消除了JavaScript代碼中的常見錯誤源。Dart支持類型推斷,因此沒有必要在每次聲明變量或函數時都包含類型樣板。  也許Dart最令人激動的功能是它在網絡之外的可用性。Dart代碼可以轉換為JavaScript以便在瀏覽器中運行,但它也可用於獨立應用程式和伺服器端開發。
  • JavaScript 基礎語法
    在一個小階段的主幹知識學習完成之後,我們再回頭詳細分析「細節」。這樣更有利於大家的吸收和理解,不容易陷入到一些不必要的問題當中。JavaScript代碼;整個代碼結合起來意思是在標籤上進行點擊的時候,會運行onclick中的JavaScript代碼;(不單單只有onclick還有onmousedown等,這邊只是幫助大家理解標籤內聯書寫,以後會進行詳細介紹)缺點:這種引入方式的代碼可閱讀性差,冗餘度高,不利於後期維護,因此實際項目開發中基本上用不到。
  • JavaScript 實現 JSON 解析器
    處理意外的輸入作為一名優秀的開發人員,我們還需要優雅地處理異常情況。對於解析器,這意味著使用適當的錯誤消息對開發人員進行提醒。讓我們處理兩種最常見的錯誤情況:•意外的標記•字符串意外結束意外的標記字符串意外結束在所有的while循環中,比如parseObject中while循環:function fakeParseJSON(str) { // ... function parseObject() { // ...
  • Excel工作表中最常見的8類錯誤,你一定遇到過,附解決方法!
    在Excel工作表中,最常用的還是一些技巧,如果能夠熟練掌握,對於工作效率的提高絕對不是一點點哦,結合工作實際,小編對工作中常見的問題進行了總結,一共有8類,你一定也遇到過……一、Excel工作表常見問題:輸入的「0」不見了。