具有空parens

时间:2016-09-28 18:11:16

标签: javascript node.js

考虑以下令人兴奋的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正在寻找什么,或以其他方式解释这种行为吗?

2 个答案:

答案 0 :(得分:2)

每个node.js documentation

  

当用户在REPL提示符中输入输入时,按下   key将当前输入行发送到eval函数。为了   为了支持多行输入,eval函数可以返回一个实例   repl。可以回复提供的回调函数:

当您通过节点“filename”执行整个文件时,节点可以检查语法错误。这是因为文件内容不会改变。

如果节点repl中的“{”之后出现语法错误,则假定您输入的是多行语句。在关闭之前,大多数多行语句的语法都不正确。因此,在语句关闭之前,它不会抛出语法错误。此外,您将无法关闭多行语句,因为节点在语法错误后无法正确解析您的代码。

您使用不正确的语法看到的内容正是上述文档中描述的内容。

答案 1 :(得分:0)

问题是您正在定义没有名称的第二个函数。第一个是好的,因为它的IIFE功能,但第二个是正常功能,你需要为它指定名称。这就是为什么终端会向您展示......因为它等着您完成功能。由于你的错误,Node REPL认为它是一个功能。