【问题标题】:Is there a way to create a named immediately invoked arrow function expression? [duplicate]有没有办法创建一个命名的立即调用的箭头函数表达式? [复制]
【发布时间】:2020-05-29 04:52:16
【问题描述】:

我认为self-documenting code (wikipedia page) 的一种好方法是将其包含在命名块中。

对于只使用一次且目的不是很明显的长代码,可以将其放入命名的 IIFE1 (different variations) 中,而不是使用 cmets:

(function functionName() {
  // ...
})();

函数命名代码,立即调用它并且是局部作用域的。

这对我来说似乎不错,但出于美学原因,我想改用 arrow function expression

未命名的“anonymous”IIAFE2

(() => {
  // ...
})();

有没有办法创建命名的 IIAFE?

以下尝试引发 SyntaxError:

(const functionName = () => {
  // ...
})();

Uncaught SyntaxError: Unexpected token 'const'


1IIFE - 立即调用的函数表达式
2 IIAFE - 立即调用的箭头函数表达式

【问题讨论】:

标签: javascript function arrow-functions


【解决方案1】:

为了解决自我记录代码的问题,下面使用 cmets 的解决方案可能更合适。

解决方案 1:

{ // explanation of purpose of this block of code
  // locally scoped code
}

解决方案 2:

(() => { // explanation
  // code
})();

解决方案 3:

// explanation of code below
// code
// optional end of code mark

解决方案 4:

(function functionName() {
  // code
})();

至于是否有可能有一个命名的 IIAFE:

如果没有 const 语句,它将向全局范围声明一个命名的 IIAFE:

(functionName = () => {
  // ...
})();

可以通过这种方式将其声明到本地范围:

let functionName;
(functionName = () => {
  // ...
})();

以下内容不会立即调用,但可以使用:

const functionName = () => {
  // ...
};
functionName();

将其包含在匿名 IIAFE 中可能是一种解决方法,但可能过于复杂:

(() => {
  const functionName = () => {
    // ...
  };
  functionName();
})();

【讨论】:

  • 最后一个只是一个匿名的IIAFE,然后将函数的返回值赋值给一个const。匿名函数未分配给functionName
  • @NicholasTower 你是对的。它似乎确实适合问题中解释的目的,但如果您认为它应该被删除或解释,请随时编辑答案,它是社区 wiki。
  • It does seem to fit for the purpose explained in the question 问题是关于制作一个命名的 iife。它不这样做。它产生一个命名的返回值。自我记录的代码很好,但是任何理解代码的人都会感到困惑,为什么将不是函数的东西称为函数。
  • 最后一个显然是错误的,应该在引起混乱之前将其删除。特别是因为它分配给一个名为functionName 的变量。这既不是函数的名称,也不是函数对象。它只包含函数调用的结果。
  • 如果你认为需要的话,在函数的开头写一个简单的注释不是更容易吗...?!
猜你喜欢
  • 2019-06-21
  • 1970-01-01
  • 2018-01-14
  • 2017-08-17
  • 2016-04-07
  • 2016-03-31
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多