为什么这在Node.js
控制台中运行(在4.1.1和5.3.0中测试)但在浏览器中不起作用(在Chrome中测试)?此代码块应创建并调用记录的匿名函数Ok
.
() => { console.log('Ok'); }()
此外,虽然上述工作在Node中,但这不起作用:
n => { console.log('Ok'); }()
这不是:
(n) => { console.log('Ok'); }()
奇怪的是,当添加参数时,它实际上会SyntaxError
在立即调用的部分抛出一个.
您需要使它成为函数表达式而不是函数定义,它不需要名称并使其成为有效的JavaScript.
(() => { console.log('Ok'); })()
相当于IIFE
(function(){ console.log('Ok') })();
并且可能的原因是它在Node.js中工作但不在chrome中工作是因为它的解析器将其解释为自执行函数,因为这
function() { console.log('hello'); }();
工作正常Node.js
这是一个函数表达式和chrome和firefox,大多数浏览器都是这样解释的.您需要手动调用它.
告诉解析器期望函数表达式的最广泛接受的方式就是将它包装在parens中,因为在JavaScript中,parens不能包含语句.此时,当解析器遇到function关键字时,它知道将其解析为函数表达式而不是函数声明.
关于参数化版本,这将起作用.
((n) => { console.log('Ok'); })()
如果没有括号,这些都不适用.
为什么?
因为根据规范:
ArrowFunction被列在AssignmentExpression
CallExpression的LHS必须是MemberExpression,SuperCall或CallExpression
所以ArrowFunction不能在CallExpression的LHS上.
什么这实际上意味着在如何=>
应解释是,它可以在同一水平排序为赋值运算符=
,+=
等等.
含义
x => {foo}()
没有成为(x => {foo})()
口译员试图将其解释为 x => ({foo}())
因此它仍然是一个SyntaxError
因此,解释器决定(
必须出错,并抛出一个SyntaxError
有关于它的通天塔中的错误在这里,太.