立即调用的函数表达式(defined and explained here)的写法通常类似于...
(function() { /* code */ })();
从上面的文章中,本·阿尔曼(Ben Alman)添加了以下评论:
在调试时向函数表达式添加标识符(从而创建命名的函数表达式)可能非常有帮助。
命名IIFE具有调试优势,例如...
(function myComponentIIFE(){ /* code */ })();
如果有优势,那么命名所有其他匿名IIFE似乎是一种惯例。 IIFE通常是匿名的吗?匿名函数是否以不同的方式处理,从而具有一定的优势?
答案 0 :(得分:0)
(function() { /* code */ })()
比(function myComponentIIFE(){ /* code */ })()
短,在缩小的代码中减少了2个字节,并且减少了思考和键入的时间。
仅当在未缩小的应用程序中使用无法链接到相应行的文本日志对它进行调试时,函数名称在调试时非常有用。在任何其他情况下,它都是无用的。
在缩小的应用程序中,调试无益,并且变得像:
(function a(){ /* code */ })();
在浏览器控制台的输出堆栈中,跟踪条目可以通过单击来动态导航到实际代码。
IIFE在现代JavaScript中的使用受到限制。 IIFE在ES5中被大量使用以实现模块模式和/或为代码块提供范围。这些用途目前由ES6块作用域和模块处理。
应用程序中存在的大多数IIFE将由这些工具自动生成。其中只有少数是由开发人员编写的。如果知道IIFE有助于调试或产生自记录代码,那么可以,给函数起一个名字是有道理的。
现代JS中的一个示例是async
IIFE,它具有例如用作应用程序入口点的用途:
(async function main() {
// ...
})()
.catch(console.error);