簡體   English   中英

Node.js中奇怪的TypeError

[英]Strange TypeError in Node.js

我正在讀一本JavaScript書,一直在使用Node.js執行代碼示例。 我一直在寫文件,然后運行node file.js

通常,我使用分號來編寫JavaScript,但是我遵循本書的風格。

我在執行其中一個代碼示例時遇到錯誤,但我不知道為什么會發生。

執行中:

var x = 2
var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

結果錯誤:

TypeError: 3 is not a function

如果我加一個; 第2行之后,例如

var x = 2
var y = 3;
(x == 2) && (y == 3)
(x > 3) || (y < 3)

它導致錯誤:

TypeError: (y == 3) is not a function

但是,如果我放置一個; 第三行之后,例如

var x = 2
var y = 3;
(x == 2) && (y == 3);
(x > 3) || (y < 3)

一切正常。

或者,如果我在Node.js命令行中分別運行每一行,那么一切都會很好。

這可能只是我對Node.js或JavaScript的誤解。 但我在網上找不到其他類似情況。

我正在使用OS X 10.11.1和Node.js v5.2.0(通過Homebrew安裝)。

這將在任何JavaScript環境中發生,而不僅僅是節點。 關於何時可以省略分號有特定的規則。 這就是為什么如果社區提倡反對省略分號的話,那么多數。

這是作為單個語句執行的:

var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

語句用上下文(或分號)描述,而不用空格或換行符描述。

var y = parseInt('10px');

是相同的

var y = parseInt
('10px');

是相同的

var y = parseInt             ('10px');

因此,當您嘗試執行var y = 3(x == 2)時,由於其后帶有括號,JIT會將3解釋為一個函數。

如果下一行以'('開頭,則該語句不會以新行終止。因此,您需要使用';'或其他標記來指定該語句已結束。

您可以在此處此處閱讀有關javascript和分號的更多信息。


發生第一個錯誤是因為代碼被中斷為:

var y = 3(x == 2)

如果來自代碼的第二個錯誤被中斷為:

(y == 3)(x > 3)

這些是無效的。


添加分號會將您的代碼更改為

var y = 3;(x == 2)

(y == 3);(x > 3)

這些是有效的。


Javascript使用分號而不是換行符來表示一條語句的結尾和另一條語句的可能開頭。 因此,當您嘗試執行時:

var x = 2
var y = 3
(x == 2) && (y == 3)
(x > 3) || (y < 3)

它解釋為:

var x = 2 var y = 3(x==2) && (y==3)(x > 3) || (y<3)

似乎您正在嘗試使用函數3(x=2)的值初始化y,這對於JavaScript中的函數聲明來說是錯誤的語法和語義。

當您在第二行之后放置分號時,它按照您的意思來解釋第1行和第2行,但是在第3行和第4行中又出現了類似的問題,添加分號后即已解決。

您只需要在JavaScript無法分辨一個語句的結尾和另一個語句的開頭的分號。 您可以省略它們,但是一般規則是這樣的

正如你可以看到這里

來源

a = b + c

(d + e).print()

不會通過自動分號插入進行轉換,因為第二行開頭的括號表達式可以解釋為函數調用的參數列表:

a = b +c(d + e).print()

在賦值語句必須以左括號開頭的情況下,對於程序員來說,在前一條語句的末尾提供顯式分號而不是依靠自動分號插入是一個好主意。

在JavaScript中不使用分號進行編碼時,這是一個眾所周知的陷阱,對於Node.js來說也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM