IIFE(Immediately Invoked Function Expression)是定义后立即执行的 JavaScript 函数。

// 方式1:括号包裹函数
(function() {
    console.log('立即执行!');
})();

// 方式2:括号包裹整个表达式
(function() {
    console.log('立即执行!');
}());

// 方式3:使用其他运算符
!function() {
    console.log('立即执行!');
}();

+function() {
    console.log('立即执行!');
}();

目的:

1. 创建私有作用域(最主要的原因)

问题: JavaScript 只有函数作用域,没有块级作用域(ES6之前)

// 没有 IIFE 的情况
var count = 0;

function increment() {
    count++;
    console.log(count);
}

increment(); // 1
increment(); // 2
// count 是全局变量,容易被修改

// 使用 IIFE 创建私有作用域
(function() {
    var privateCount = 0; // 私有变量
    
    window.increment = function() {
        privateCount++;
        console.log(privateCount);
    };
})();

increment(); // 1
increment(); // 2
console.log(typeof privateCount); // undefined - 无法访问

ES6 的现代替代方案

1. 块级作用域(主要替代)

  • let/const 块级作用域,不使用var

// 使用 {} 创建块级作用域
{
    const privateVar = '私有变量';
    let counter = 0;
    
    console.log(privateVar); // 私有变量
}

// console.log(privateVar); // 报错: privateVar is not defined
// console.log(counter);    // 报错: counter is not defined

2. 类私有字段(ES2022+)

class Counter {
    #count = 0; // 私有字段
    
    increment() {
        this.#count++;
    }
    
    getCount() {
        return this.#count;
    }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 1
// console.log(counter.#count); // 语法错误

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐