首页 > 解决方案 > 为什么当我用箭头函数重写 IIFE 时,它不能与 Douglas Crockford 的风格一起使用?

问题描述

我有一个可以工作的 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) 上的版本不起作用。

标签: javascriptiife

解决方案


这就是语言定义它的方式。正如mdn所说:

尽管箭头函数中的箭头不是运算符,但箭头函数具有特殊的解析规则,与常规函数相比,它们与运算符优先级的交互方式不同。

它继续举另一个例子,但原理是一样的:

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);

推荐阅读