ES6立即调用了箭头功能

Cri*_*sty 134 javascript node.js arrow-functions

为什么这在Node.js控制台中运行(在4.1.1和5.3.0中测试)但在浏览器中不起作用(在Chrome中测试)?此代码块应创建并调用记录的匿名函数Ok.

() => {
  console.log('Ok');
}()
Run Code Online (Sandbox Code Playgroud)

此外,虽然上述工作在Node中,但这不起作用:

n => {
  console.log('Ok');
}()
Run Code Online (Sandbox Code Playgroud)

这不是:

(n) => {
  console.log('Ok');
}()
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当添加参数时,它实际上会SyntaxError在立即调用的部分抛出一个.

voi*_*oid 164

您需要使它成为函数表达式而不是函数定义,它不需要名称并使其成为有效的JavaScript.

(() => {
  console.log('Ok');
})()
Run Code Online (Sandbox Code Playgroud)

相当于IIFE

(function(){
   console.log('Ok')
})();
Run Code Online (Sandbox Code Playgroud)

并且可能的原因是它在Node.js中工作但不在chrome中工作是因为它的解析器将其解释为自执行函数,因为这

function() { console.log('hello'); }();
Run Code Online (Sandbox Code Playgroud)

工作正常Node.js这是一个函数表达式和chrome和firefox,大多数浏览器都是这样解释的.您需要手动调用它.

告诉解析器期望函数表达式的最广泛接受的方式就是将它包装在parens中,因为在JavaScript中,parens不能包含语句.此时,当解析器遇到function关键字时,它知道将其解析为函数表达式而不是函数声明.

关于参数化版本,这将起作用.

((n) => {
  console.log('Ok');
})()
Run Code Online (Sandbox Code Playgroud)

  • 第一个示例在`Node.js`中工作并实际记录该值.我的问题是它为什么有效?为什么我添加参数时没有? (4认同)
  • 我没有downvote,但问题是为什么参数化版本在没有参数的完全相同的定义时在Node中不起作用 - 它不是要求匿名函数的Node/Chrome实现之间的区别 (3认同)

Pau*_* S. 17

如果没有括号,这些都不适用.

为什么?

因为根据规范:

  1. ArrowFunction列在AssignmentExpression
  2. CallExpressionLHS必须是MemberExpression,SuperCallCallExpression

所以ArrowFunction不能在CallExpression的LHS上.


什么这实际上意味着在如何=>应解释是,它可以在同一水平排序为赋值运算符=,+=等等.

含义

  • x => {foo}() 没有成为(x => {foo})()
  • 口译员试图将其解释为 x => ({foo}())
  • 因此它仍然是一个SyntaxError
  • 因此,解释器决定(必须出错,并抛出一个SyntaxError

有关于它的通天塔中的错误在这里,太.