奇怪的TypeError在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 

如果我添加一个; 在第二行之后,例如

 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中函数声明的错误语法和语义。

当你在第二行后面加一个分号时,它将第一行和第二行解释为你所要解释的那一行,但是第三行和第四行也出现了类似的问题,一旦你添加了分号,就会修复这个问题。

您只需要分号,javascript不能告诉一个语句的结束和另一个语句的开始。 你可以省略它们,但一般的规则是这样的 。

正如你在这里看到的,

来源

a = b + c

(d + e).print()

不会被自动分号插入转换,因为开始第二行的括号expression式可以被解释为函数调用的参数列表:

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

在赋值语句必须以左括号开头的情况下,程序员在前面的语句末尾提供一个明确的分号是一个好主意,而不是依靠自动分号插入。

当在JavaScript中不使用分号进行编码时,这是一个众所周知的陷阱,对于Node.js也是如此。