当我用箭头函数重写时,为什么 IIFE 不能与 Douglas Crockford 的风格一起使用?

Why can't an IIFE be used with Douglas Crockford's style when I rewrite it with an arrow function?

我有一个可用的 IIFE,但是当我使用箭头函数重写它时,它不起作用!

1.- 这个很好用:

let j = 3;

(function (n) {
  while (n--)
    console.log("n only", n);
}(j));

2.- 这个不行!:

((n) => {
  while (n--)
    console.log("n only", n);
}(j));

3.- 我已经测试了下一个版本也可以工作:

((n) => {
  while (n--)
    console.log("n only", n);
})(j);

但我真的很想知道为什么 (2) 上的版本不起作用。

两者都有效,但你打错了:确保你写 (<function def>)()

let a = 3;

((b) => {
  while(b--) console.log(b);
})(a);

(function(b){
  while(b--) console.log(b);
})(a);

语言就是这样定义它的。正如 mdn 所述:

Although the arrow in an arrow function is not an operator, arrow functions have special parsing rules that interact differently with operator precedence compared to regular functions.

继续再举个例子,原理是一样的:

let callback;

callback = callback || function() {}; // ok

callback = callback || () => {};
// SyntaxError: invalid arrow-function arguments

callback = callback || (() => {});    // ok

虽然 Crockford 表示更喜欢将 IIFE 的右括号放在最后(在参数之后),但我个人认为将它放在与箭头函数所需的位置相同的位置更直观(在右大括号之后,参数之前)。

原因是括号的目的是将 函数 转换为函数表达式,因此参数在该转换中并不重要。所以这似乎更切题:

(function (n) => {
  while (n--)
    console.log("n only", n);
})(j);

什么是有效语法,什么是无效语法由语言决定 grammar

一个CallExpression定义为

MemberExpression Arguments

但是 ArrowFunction 不是 MemberExpression,而是 AssignmentExpression

为什么 是这种情况将是 TC39 委员会的一个问题。