ES6 立即调用箭头函数

2022-08-30 01:39:17

为什么这在 Node.js 控制台(在 4.1.1 和 5.3.0 中测试)中工作,但在浏览器中不起作用(在 Chrome 中测试)?

此代码块应创建并调用一个记录 的匿名函数。Ok

() => {
  console.log('Ok');
}()

此外,虽然上述内容在 Node.js 中起作用,但这不起作用:

n => {
  console.log('Ok');
}()

也不是这个:

(n) => {
  console.log('Ok');
}()

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


答案 1

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

(() => {
  console.log('Ok');
})();

相当于IIFE

(function() {
   console.log('Ok');
})();

而这适用于Node.js而不是Chrome的可能原因是因为它的解析器将其解释为一个自动执行的函数,因为

function() { console.log('hello'); }();

在 中工作正常。这是一个函数表达式,Chrome,Firefox和大多数浏览器都以这种方式解释它。您需要手动调用它。Node.js

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

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

((n) => {
  console.log('Ok');
})()

答案 2

这些都不应该在没有括号的情况下工作。

为什么?

因为根据规格:

  1. ArrowFunction 列在 AssignmentExpression
  2. 呼叫表达式的 LHS 必须是成员表达式超级呼叫呼叫表达式

因此,ArrowFunction不能位于CallExpression的LHS上。


这在如何解释方面有效意味着,它与赋值运算符在相同的级别上工作,等等。=>=+=

意义

  • x => {foo}() 不会变成(x => {foo})()
  • 解释器尝试将其解释为x => ({foo}())
  • 因此,它仍然是一个语法错误
  • 因此,解释器确定一定是错的,并抛出一个语法错误(

巴别塔上也有一个关于它的错误