首页 > 解决方案 > 是否有技术或代码风格的原因不命名您的 IIFE 函数?

问题描述

立即调用的函数表达式(在此处定义和解释)通常写成...

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

在上面的文章中,Ben Alman 添加了以下评论:

向函数表达式添加标识符(从而创建命名函数表达式)在调试时非常有用。

命名您的 IIFE 有一个调试优势,例如...

(function myComponentIIFE(){ /* code */ })();

如果有一些优势,那么命名所有其他匿名的 IIFE 似乎应该是一种常见的做法。IIFE 通常是匿名的有什么原因吗?匿名函数是否以不同的方式处理以使其具有某些优势?

标签: javascriptecmascript-6iife

解决方案


(function() { /* code */ })()比 短(function myComponentIIFE(){ /* code */ })(),在缩小的代码中减少 2 个字节,思考和输入的时间也更少。

仅当在未缩小的应用程序中使用无法链接到相应行的文本日志进行调试时,函数名称才非常有用。在任何其他情况下,它都是无用的。

在缩小的应用程序中,它不利于调试,并且变成如下所示:

(function a(){ /* code */ })();

在浏览器控制台输出堆栈跟踪条目可以通过单击动态导航到实际代码。

IIFE 在现代 JavaScript 中的使用有限。IIFE 在 ES5 中被大量用于实现模块模式和/或为代码块提供范围。这些用途目前由 ES6 块作用域和模块处理。

应用程序中存在的大多数 IIFE 将由工具自动生成。其中只有少数是由开发人员编写的。如果已知 IIFE 有利于调试或导致自记录代码,那么是的,给函数命名是有意义的。

现代 JS 中的一个例子是asyncIIFE,它有它的用途,例如,作为应用程序入口点:

(async function main() {
  // ...
})()
.catch(console.error);

推荐阅读