考虑以下令人兴奋的JavaScript代码:
(function(){console.log("wtf?");})()
function(){console.log("wtf?");}()
将此代码放在文件dumb.js
中并使用node运行,您将得到以下结果:
private/tmp/junk/dumb.js:2
function(){console.log("wtf?");}()
^
SyntaxError: Unexpected token (
at Object.exports.runInThisContext (vm.js:76:16)
at Module._compile (module.js:528:28)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3
出乎意料的是,这是一个语法错误。但是,在Node REPL上,我们看到了
$ node
> (function(){console.log("wtf?");})()
wtf?
undefined
> function(){console.log("wtf?");}()
...
此时,除了.break
,^C
之外,其他内容都不会延续到续行。
我不明白。
有人可以解释一下REPL正在寻找什么,或以其他方式解释这种行为吗?
答案 0 :(得分:2)
每个node.js documentation:
当用户在REPL提示符中输入输入时,按下 key将当前输入行发送到eval函数。为了 为了支持多行输入,eval函数可以返回一个实例 repl。可以回复提供的回调函数:
当您通过节点“filename”执行整个文件时,节点可以检查语法错误。这是因为文件内容不会改变。
如果节点repl中的“{”之后出现语法错误,则假定您输入的是多行语句。在关闭之前,大多数多行语句的语法都不正确。因此,在语句关闭之前,它不会抛出语法错误。此外,您将无法关闭多行语句,因为节点在语法错误后无法正确解析您的代码。
您使用不正确的语法看到的内容正是上述文档中描述的内容。
答案 1 :(得分:0)
问题是您正在定义没有名称的第二个函数。第一个是好的,因为它的IIFE功能,但第二个是正常功能,你需要为它指定名称。这就是为什么终端会向您展示......因为它等着您完成功能。由于你的错误,Node REPL认为它是一个功能。