JavaScript中的括号翻转问题

33

Javascript为什么可以在函数调用中使用反向括号,比如这样的形式?我正在CLI上运行Node控制台,具体是Node版本0.10.25。

function a(){ return 42 }
a() // -> 42
a)( // -> 42.  WTF?

function b(t){ return t }
b(4) // -> 4
b)4( // No function evaluation; presumably dangling parentheses
b)(4 // -> 4.  WTF?

补充说明:这似乎在Chrome 33.0.1750.152、Safari 7.0.2或Firefox 27.01中无法正常工作。这实际上是ECMAScript某种解释的“特性”还是Node的特殊之处?如果Node使用V8,那么它不应该与Chrome的结果匹配吗?


8
Chrome 中出现了 Unexpected token ) 错误,而在 IE 11 中则是 Expected ';' - Cᴏʀʏ
1
这绝对在Google Chrome上不起作用。 - Petar Vasilev
3
我在CLI上的Node控制台中运行。这可能是Node的特定行为。 - tetri
2
也许它被解释为 (b)(4) - gen_Eric
2
我打赌Node的代码会在一对()中进行评估,因此它变成了(b)(4) - cookie monster
显示剩余11条评论
1个回答

23

有可能控制台将所有内容都包装在一个eval语句中: 实际上被评估的可能是 eval(a)()。在这种情况下,Chrome也会返回42。


1
甚至只是一组括号:a)( => (a)() - Cᴏʀʏ
2
好的,现在谁会查看所有node.js源代码来验证呢? - Romain Braun
7
猜测这就是这一行代码:evalCmd = '(' + evalCmd + ')\n'; https://github.com/joyent/node/blob/master/lib/repl.js#L268 - cookie monster
1
根据@cookiemonster发现的情况,它被评估为eval('(a)()') - Matthew Blancarte
1
@MatthewBlancarte:问题不在于它在eval调用中,而更具体地说,在被eval之前,代码被包裹在“(”和“)”中。 - cookie monster
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接