繁体   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