Node.js的REPL语法,父节点为空

Node.js REPL syntax with empty parens

本文关键字:父节点 语法 js REPL Node      更新时间:2023-09-26

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

每个node.js文档:

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

当你通过节点"filename"执行整个文件时,节点有能力检查语法错误。这是因为文件内容不会改变。

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

您所看到的错误语法正是上述文档中所描述的。

问题是您正在定义第二个没有名称的函数。第一个可以,因为它是IIFE函数,但第二个是普通函数,你需要给它命名。这就是为什么终端显示你…因为它在等你完成函数。由于您的错误,Node REPL假定它是一个函数。