2016-09-28 64 views
0

Node.js的REPL语法考虑下面的激动人心的JavaScript代码:空括号

(function(){console.log("wtf?");})() 
function(){console.log("wtf?");}() 

将此代码放在一个文件dumb.js与节点运行,你会得到以下结果:

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 

不出意外,这是一个语法错误。然而,在节点REPL,我们看到

$ node 
> (function(){console.log("wtf?");})() 
wtf? 
undefined 
> function(){console.log("wtf?");}() 
... 

在这一点上,不过.break^C等跳出连续行。

我不明白。

有人可以解释一下REPL正在寻找什么,或者解释这种行为吗?

+0

高丽,那*确实*迷惑它,不是吗? –

+0

虽然这里真正的问题是什么? –

+0

我的现实世界问题是试图向javascript学生解释到底发生了什么。 –

回答

2

每Node.js的documentation

作为用户键入输入到REPL提示,按 键将输入的当前行发送给eval函数。为了 支持多行输入,eval函数可以repl.Recoverable的返回一个实例 到提供的回调函数:

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

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

你用错误的语法看到的内容正是上述文档中描述的内容。

+0

是的,谢谢你,你已经成功地复制了我在我的问题中提出的问题。 –

+1

更新后的答案更具体。 – user2263572

+0

谢谢。说实话,这看起来像一个错误。 –

0

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