奇怪的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也是如此。