JavaScript 立即调用的函数表达式(IIFE)
函数是任何编程语言的基本构建块之一,JavaScript将这些函数提升到一个全新的水平。函数被视为一组语句,在特定上下文中按照适当的顺序执行。现在,JavaScript提供了各种方法来定义和执行函数,有带有名称的函数和匿名函数,还有一些在挂载时立即执行的函数,这些函数被称为 立即调用的函数表达式或IIFEs 。让我们深入了解更多关于IIFEs的内容。
语法: IIFEs遵循以下特定的语法。
(function (){
// Function Logic Here.
})();
现在让我们进一步探索一下,以了解这种类型函数的名称和语法之间的关系。
为什么叫做立即执行的函数表达式?
- 立即执行: 这一部分很容易解释和演示。这种类型的函数被称为立即执行,因为它们在被推入栈时立即执行,不需要显式调用。如果我们看一下语法本身,我们有两对闭合的括号,第一个包含要执行的逻辑,第二个通常是我们在调用函数时包含的内容,第二个括号负责告诉编译器要立即执行函数表达式。
- 函数表达式: 很容易理解,函数表达式是一个作为表达式使用的函数。JavaScript允许我们使用函数作为函数表达式,如果我们将函数赋值给一个变量、将函数包裹在括号中或在函数前面放一个逻辑非。下面的程序示例演示了我们可以创建函数表达式的不同方式。
// Creating Function Expression by assigning to a variable.
var myFunc = function() { return "GeeksforGeeks"; };
// Creating Function Expression Using Logical Not.
!function() { return "GeeksforGeeks"; };
// Creating Function Expression Using Parentheses.
(function() { return "GeeksforGeeks"; });
- 现在,如果你看第三个示例代码,它与IIFE的语法的第一部分完全相同,因此我们可以得出结论:IIFE的第一部分包含一个函数表达式,而最后部分立即调用它。
将函数转换为IIFE
正如我们已经看到的,IIFE是什么以及它的语法形式如何被分解以增加可读性,我们可以通过以下两个步骤将常规函数转换为IIFE。
- 给定任何常规函数定义,将其包裹在一对闭合的括号中,这将创建你的函数表达式。
- 最后,添加另一对括号和一个分号来标记语句的结束,这样你就将常规函数转换为IIFE。
示例:
<script>
// Regular Function.
function Greet() {
console.log("Welcome to GFG!");
};
// Execution of Regular Function.
Greet();
// IIFE creation and execution.
(function() {
console.log("Welcome to GFG!");
})();
</script>
输出:
Welcome to GFG!
Welcome to GFG!
重要的点
立即调用函数表达式(IIFE)跟JavaScript中的任何其他函数/变量一样,遵循自己的作用域。对于新开发者来说,“立即调用”这个名字有时会让人糊涂,他们会期望IIFE在函数作用域之外执行,这是错误的。例如,让我们看下面的示例,其中的IIFE被定义在一个函数内部,只有在调用父函数时,才会立即调用它。
示例:
<script>
function myFunc()
{
console.log("Welcome to");
// This will be executed after executing the previous log.
(function() { console.log("GeeksForGeeks!"); })();
console.log("Hi There!");
}
// Calling the Function.
myFunc();
</script>
输出:
Welcome to
GeeksForGeeks!
Hi There!
- IIFEs拥有自己的作用域,即在函数表达式中声明的变量在函数外部将无法使用。
- 与其他函数类似,IIFEs也可以具有命名或匿名的形式,但是即使IIFE有一个名称,也无法引用或调用它。
- IIFEs也可以带有参数。例如,
示例:
<script>
// Declaring the parameter required.
(function(dt) {
console.log(dt.toLocaleTimeString());
// Passing the Parameter.
})(new Date());
</script>
输出:
4:30:12 PM
IIFE的使用情况
- 避免污染全局命名空间
- 创建闭包
- 避免库和程序之间的变量名冲突。
- IIFE用于创建私有和公共变量和方法
- 用于执行异步和等待函数
- 在JQuery库中使用
- 用于与require函数一起使用
极客教程