JavaScript IIFE

一、什么是IIFE?

IIFE 是 Immediately Invoked Function Expression 的缩写,中文翻译为 立即执行函数表达式。它是一种 JavaScript 中的函数表达形式,定义后立即执行。

二、IIFE有什么特点?

  1. 定义后立即执行:IIFE 不需要显式调用,定义后立即运行。
  2. 独立作用域:IIFE 创建了一个独立的作用域,避免变量污染全局作用域。
  3. 常用于初始化或隔离代码:适合一次性运行的代码片段,比如配置初始化或模块化封装。

三、基本语法

IIFE 的语法形式如下:

(function () {
  // 在这里编写代码
  console.log('IIFE executed!');
})();

或者使用箭头函数:

(() => {
    console.log('IIFE executed with arrow function!');
})();

四、基础用法

4.1 不带参IIFE

函数被包含在一对括号内,转化为表达式 。 紧随的 () 立即调用函数。

(function () {
    const message = 'Hello, IIFE!';
    console.log(message); // 输出: Hello, IIFE!
})();

4.2 带参IIFE

IFE 支持参数传递。函数立即运行时可以接收外部值。

(function (name) {
    console.log(`Hello, ${name}!`);
})('World');

4.3 独立作用域

IIFE 中的变量 x 与全局变量 x 不冲突,IIFE 创建了一个独立的作用域。

const x = 10;

(function () {
    const x = 20;
    console.log(x); // 输出: 20 (IIFE 内部变量)
})();

console.log(x); // 输出: 10 (全局变量未受影响)

4.4 初始化逻辑

IIFE 常用于初始化应用的配置或模块。IIFE 内部的 apiKey 是私有的,外部无法直接访问,通过返回的对象暴露了访问接口。

const config = (function () {
    const apiKey = '123456'; // 私有变量
    return {
        getApiKey: () => apiKey,
    };
})();

console.log(config.getApiKey()); // 输出: 123456

五、IIFE和普通函数的区别

IIFE(立即执行函数表达式)和普通函数的主要区别在于 执行时机使用场景

5.1 执行方式

IIFE定义后立即执行,不需要显式调用,定义时就会运行一次。

(function () {
    console.log('IIFE executed'); // 立即运行
})();

普通函数定义后,需要显式调用才会执行。

function normalFunction() {
    console.log('Normal function executed');
}

normalFunction(); // 必须显式调用

5.2 作用域

IIFE创建一个独立的局部作用域。 函数内定义的变量不会污染全局或外部作用域。

(function () {
    const privateVar = 'This is private';
    console.log(privateVar); // 输出: This is private
})();

console.log(privateVar); // 报错: privateVar 未定义

普通函数不执行时,其内部逻辑和变量不会影响作用域。 定义但未调用的函数,不会产生任何执行效果。

function normalFunction() {
    const privateVar = 'This is private';
}

normalFunction(); // 执行后,privateVar 是局部变量,仍然不可访问

console.log(typeof privateVar); // 报错: privateVar 未定义

5.3 使用场景

  1. IIFE
  • 一次性逻辑:用于只需要执行一次的逻辑,比如初始化数据、计算值等。
  • 避免变量污染:在局部范围内定义变量,防止与外部变量冲突。
const config = (function () {
    const secretKey = '12345';
    return {
        getSecretKey: () => secretKey,
    };
})();

console.log(config.getSecretKey()); // 输出: 12345
console.log(typeof secretKey); // 报错: secretKey 未定义
  1. 普通函数
  • 复用逻辑:适合定义需要多次调用的函数。
  • 模块化:适合将逻辑封装为可以重复调用的模块。
//可重复调用
function multiply(a, b) {
    return a * b;
}

console.log(multiply(2, 3)); // 输出: 6
console.log(multiply(4, 5)); // 输出: 20

5.4 性能和可读性

  1. IIFE
  • 性能:开销很小,但每次渲染时都会重新创建并执行。
  • 可读性:逻辑较复杂时,嵌套的 IIFE 会降低代码的可读性。

示例(复杂逻辑):

function Greeting({ user }) {
    return (
        <div>
            {(() => {
                const role = user.isAdmin ? 'Admin' : 'User';
                return user.isLoggedIn
                    ? `Welcome back, ${user.name}! Role: ${role}`
                    : 'Please sign in.';
            })()}
        </div>
    );
}
  1. 普通函数
  • 性能:对于重复逻辑,普通函数更高效,因为它不会每次都重新创建。
  • 可读性:分离逻辑到独立函数中,代码更清晰、易维护。

5.5 总结

特性

IIFE

普通函数

执行时机

定义后立即执行

显式调用时才执行

作用域

创建独立作用域

执行后创建局部作用域

使用场景

一次性逻辑、避免变量污染、动态 JSX 逻辑

复用逻辑、模块化、事件处理

可读性

适合简单逻辑,复杂时可读性差

更清晰,适合分离逻辑

性能

每次渲染重新创建和执行

复用逻辑更高效

选择 IIFE普通函数,应根据使用场景的需求:

  • 如果逻辑是 临时的、一次性的,选择 IIFE。
  • 如果逻辑需要 复用,选择普通函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值