/

如何解決 JavaScript 中的「is not a function」錯誤

如何解決 JavaScript 中的「is not a function」錯誤

我在寫 JavaScript 時不加分號。

而這個我真的很喜歡。在我看來,這樣子語言更加清晰。

你可能不喜歡這樣,這是可以理解的。但這就是事實。

分號是可選的,我們沒有必要加上它們。

然而,有時我們必須要特別注意。尤其在 Node.js 中,我們使用 require() 來載入外部模組和檔案。

這可能會導致某些情況下出現以下錯誤:

1
TypeError: require(...) is not a function

這是一個奇怪的錯誤,對吧?

讓我們看看我是如何遇到這個錯誤的。

我載入了一個函式庫,然後我要在根層級執行一些程式碼,並且我建立了一個立即調用的異步函式:

1
2
3
4
5
const fs = require('fs')

(async () => {
//...
})()

JS 在 require() 後面看不到分號,然後我們以 ( 開頭一行,JS 以為我們要執行一個函式。

它將 require('fs') 視為函式的名稱,如果該模組導出返回了一個函式,這實際上是可以正常工作的。

但實際上並不是這樣,所以我們得到了 ...is not a function 的錯誤。

我們該如何解決這個問題呢?

我們需要加上一個分號。隨便哪都可以。

這個方法能有效解決問題:

1
2
3
4
5
const fs = require('fs')

;(async () => {
//...
})()

另外這個方法也能正常工作:

1
2
3
4
5
const fs = require('fs');

(async () => {
//...
})()

這是我們必須付出的一點小代價,為了避免到處使用分號。

提示:頂層 await 是一個新功能,你可以使用它而不是這種結構,這將避免這樣的錯誤。

tags: [“JavaScript”, “Node.js”, “async functions”]