立即执行函数表达式(IIFE)是什么?

114 阅读2分钟

立即执行函数表达式(Immediately Invoked Function Expression,IIFE)是一种在定义后立即执行的 JavaScript 函数。它主要用于创建独立的作用域,避免全局变量污染,并且能在代码加载时就执行特定的逻辑。

语法结构

IIFE 有两种常见的语法形式:

形式一:使用括号将函数包裹起来,然后紧跟另一对括号来调用函数

(function() {
    // 函数体
    console.log('这是一个 IIFE');
})();

形式二:使用括号将整个函数表达式和调用都包裹起来

(function() {
    // 函数体
    console.log('这也是一个 IIFE');
}());

特点

  • 立即执行:定义后马上执行,无需额外调用。
  • 创建独立作用域:函数内部的变量和函数不会影响到全局作用域,避免了变量名冲突。

用途

1. 避免全局变量污染

在大型项目中,如果有大量的变量和函数定义在全局作用域,容易造成命名冲突。使用 IIFE 可以创建独立的作用域,将变量和函数封装在内部。

(function() {
    let privateVariable = '我是私有变量';
    function privateFunction() {
        console.log(privateVariable);
    }
    privateFunction();
})();
// 下面这行代码会报错,因为 privateVariable 和 privateFunction 在 IIFE 外部不可访问
// console.log(privateVariable); 

2. 实现私有变量和方法

通过 IIFE 可以模拟面向对象编程中的私有属性和方法。

const counter = (function() {
    let count = 0;
    return {
        increment: function() {
            count++;
            return count;
        },
        decrement: function() {
            count--;
            return count;
        },
        getValue: function() {
            return count;
        }
    };
})();

console.log(counter.increment()); 
console.log(counter.decrement()); 

在这个例子中,count 变量被封装在 IIFE 内部,外部无法直接访问,只能通过返回对象的方法来操作和获取其值。

3. 处理循环中的闭包问题

在循环中使用闭包时,如果不使用 IIFE,可能会出现所有闭包共享同一个变量的问题。使用 IIFE 可以为每个闭包创建独立的变量副本。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
</head>

<body>
    <ul>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
    </ul>
    <script>
        const listItems = document.querySelectorAll('li');
        for (let i = 0; i < listItems.length; i++) {
            (function(index) {
                listItems[index].addEventListener('click', function() {
                    alert(`You clicked item ${index + 1}`);
                });
            })(i);
        }
    </script>
</body>

</html>

在这个例子中,使用 IIFE 为每个点击事件处理程序创建了独立的 index 值,避免了所有事件处理程序都使用相同的 i 值的问题。

总之,IIFE 是 JavaScript 中一个非常实用的技术,在很多场景下都能发挥重要作用。