為了回饋社區,codeburst 從他們公司的上千個項目中,整理了 JavaScript 出現次數最多的 10 個錯誤。如果能避免這些錯誤的話,那麼你能成為一個更好的程式設計師。以下就是排名最高的 10 個 錯誤:
Uncaught TypeError: Cannot read property
這個錯誤大家應該經常碰到,當你在 Chrome 瀏覽器中,從一個 undefined 的對象上嘗試讀取一個屬性或者調用一個方法的時候,就會拋出這個錯誤:
TypeError: 『undefined』 is not an object (evaluating
上述相同的錯誤,在 Safari 瀏覽器中給出的是不同的錯誤信息,在 Safari 瀏覽器上實驗可以得到這個結果。
TypeError: null is not an object (evaluating
在 Safari 瀏覽器上,從一個 null 對象上讀取屬性或者調用方法的時候,就會拋出這個錯誤。在 JavaScript 的世界裡,null 和 undefined 是不同的,null 代表這個對象是一個空的值,而 undefined 代表這個對象的值沒有定義。
這種錯誤較為常見的出現方式是,在頁面尚未加載完畢的時候,就直接操作 DOM,而實際上這個 DOM 節點現在還是一個 null。所以一定要等頁面加載完畢後,再操作 DOM:
(unknown): Script error
如果你的 JavaScript 代碼放在 CDN 上,那麼這段代碼拋出的任何未捕獲的錯誤都會報腳本錯誤。這是瀏覽器的防止代碼跨源訪問的一種安全機制。
TypeError: Object doesn’t support property
在 IE 瀏覽器上,當你調用一個未定義的方法時,就會出現這個錯誤。這個和下面介紹的 Chrome 瀏覽器上拋出的 「TypeError: 『undefined』 is not a function」錯誤是一個類型。
TypeError: 『undefined』 is not a function
在 Chrome 瀏覽器上調用一個未定義的方法時,會拋出這個錯誤。
JavaScript 近些年的發展趨勢比較快,開發複雜度逐步增加,所以開發者可能會弄混當前的 this 究竟是指向哪個對象:
Uncaught RangeError: Maximum call stack
這種情況是因為函數遞歸,超出了棧的最大大小限制,這個時候應該仔細檢查參數的變化,它可能沒有按照你想像的那樣變化:
TypeError: Cannot read property 『length』
從一個未定義的變量上嘗試讀取它的長度屬性,會發生這樣的錯誤:
開發者錯誤的假定當前的數組一定是初始化後的,而實際上忘記傳遞參數是常有的事兒:
Uncaught TypeError: Cannot set property
我們不能在一個未定義的變量上,調用任何 set 或者 get 方法:
ReferenceError: event is not defined
在事件處理的時候,比較容易得到這樣的錯誤。舊版本的 IE 瀏覽器提供了一個全局可訪問的 event 變量,Chrome 自動將 event 對象綁定到回調函數上,Firefox 卻不會自動綁定。於是 jQuery 就為大家提供了一個統一的訪問事件對象的方式。
總結
大多數錯誤都是因為 null 或 undefined 引起的錯誤。使用靜態類型的 JavaScript 語言例如 TypeScript 可以有效幫你應對這些情況,它會給予你一些警告信息。希望大家在以後的編程中,儘量避開這些錯誤,它們看起來微不足道,卻又是大家最常犯的錯誤。