当前位置: 首页 > news >正文

js 立即执行函数表达式(Immediately Invoked Function Expression,简称 IIFE):(function () {})();

1、解释

(function () {// 函数体
})();

可以分成两部分理解:

  1. (function () { ... })

    • 这是一个函数表达式,被包裹在括号 () 中。
    • JavaScript 引擎会把它当作一个表达式(而不是函数声明),因此可以立即调用
  2. ()(最后的这对括号)

    • 表示立刻调用前面定义的这个函数。
    • 就像你写 myFunction() 一样,这里是“定义完就马上执行”。

2、作用

1. 创建私有作用域(避免污染全局变量)

在 IIFE 内部定义的变量、函数,不会暴露到全局作用域,防止命名冲突。

(function () {var secret = '123456'; // 这个变量只在 IIFE 内部可见console.log(secret);   // 可以访问
})();console.log(secret); // ❌ 报错:secret is not defined

2. 避免命名冲突

var count = 10;(function () {var count = 20;  // 独立的局部变量console.log(count); // 20
})();console.log(count); // 10

3. 模块化封装(早期 JS 模块模式)

在 ES6 模块(import/export)普及之前,IIFE 是实现“模块”的主要方式。

var myModule = (function () {var privateVar = 'hidden';return {publicMethod: function () {console.log(privateVar);}};
})();myModule.publicMethod(); // 输出 "hidden"

4. 避免变量提升(hoisting)带来的问题

由于 IIFE 创建了新作用域,里面的 varfunction 不会影响外部。

对比:不用 IIFE 的风险

// ❌ 危险:所有变量都挂到全局
var deviceState = false;
var options = {};
function init() { ... }// 如果其他脚本也用了 deviceState,就会冲突!

而用 IIFE 后:

// ✅ 安全:完全隔离
(function () {var deviceState = false;var options = {};function init() { ... }
})();

现代替代方案(ES6+)

现在更推荐使用 ES6 模块:

// sdk.js
const deviceState = false;
export function readCard() { ... }// main.js
import { readCard } from './sdk.js';

但 IIFE 在不支持模块的环境(如老项目、浏览器直接引入脚本)中仍然非常有用。

3、暴露方法给外部调用

1. 返回值方式(最常用)

// 返回一个对象,包含公开的方法
var myModule = (function () {var privateVar = "我是私有的";function privateMethod() {return privateVar;}function publicMethod1() {return "公开方法1: " + privateMethod();}function publicMethod2() {return "公开方法2";}// 返回要公开的方法return {method1: publicMethod1,method2: publicMethod2,// 也可以直接暴露值version: "1.0.0"};
})();// 外部调用
console.log(myModule.method1()); // "公开方法1: 我是私有的"
console.log(myModule.method2()); // "公开方法2"
console.log(myModule.version);   // "1.0.0"

2. 全局变量方式

(function (window) {var privateVar = "私有数据";function privateMethod() {return privateVar;}// 挂载到全局对象window.myModule = {publicMethod: function () {return "使用私有数据: " + privateMethod();},anotherMethod: function () {return "另一个方法";}};
})(window || global); // 兼容Node.js环境// 外部调用
console.log(myModule.publicMethod()); // "使用私有数据: 私有数据"

3. 参数注入方式(如jQuery插件)

(function ($, exports) {var privateData = 100;function calculate(x) {return privateData + x;}// 注入到传入的对象中exports.calc = calculate;exports.name = "计算模块";
})(jQuery, window.myPlugin = window.myPlugin || {});// 外部调用
console.log(myPlugin.calc(50)); // 150
console.log(myPlugin.name);     // "计算模块"

4. 模块模式变体

揭示模块模式(Revealing Module Pattern)

var counterModule = (function () {var count = 0;function increment() {count++;return count;}function decrement() {count--;return count;}function getCount() {return count;}// 明确暴露哪些方法return {add: increment,subtract: decrement,getCurrent: getCount// 注意:count变量本身没有被暴露
    };
})();// 使用
counterModule.add();      // 1
counterModule.add();      // 2
console.log(counterModule.getCurrent()); // 2

5. 支持多实例的模式

var CreateCalculator = (function () {// 私有静态变量(所有实例共享)var instanceCount = 0;function Calculator(initialValue) {// 私有实例变量var value = initialValue || 0;// 公有方法this.add = function (x) {value += x;return this;};this.getValue = function () {return value;};}// 静态方法Calculator.getInstanceCount = function () {return instanceCount;};// 工厂方法return function (initialValue) {instanceCount++;return new Calculator(initialValue);};
})();// 创建多个实例
var calc1 = CreateCalculator(10);
var calc2 = CreateCalculator(20);calc1.add(5);
console.log(calc1.getValue()); // 15
console.log(calc2.getValue()); // 20

实际应用示例

// 创建一个简单的工具库
var Utils = (function () {// 私有辅助函数function formatDate(date) {return date.toISOString().split('T')[0];}function validateEmail(email) {return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);}// 公开的APIreturn {// 日期处理getCurrentDate: function () {return formatDate(new Date());},// 字符串处理truncate: function (str, length) {return str.length > length ? str.substr(0, length) + '...' : str;},// 验证
        isEmail: validateEmail,// 工具方法debounce: function (fn, delay) {let timer;return function (...args) {clearTimeout(timer);timer = setTimeout(() => fn.apply(this, args), delay);};}};
})();// 使用
console.log(Utils.getCurrentDate());
console.log(Utils.isEmail("test@example.com"));
console.log(Utils.truncate("这是一个很长的字符串", 5));

关键点:

  1. 返回值方式最常用,通过return暴露需要公开的方法

  2. 揭示模块模式更清晰,明确区分内部实现和公开接口

  3. 可以暴露方法、属性、构造函数等

  4. 私有变量和函数不会被外部直接访问

 

总结

写法名称作用
(function () {})(); IIFE(立即执行函数) 创建私有作用域,封装逻辑,避免全局污染

 

 

 

http://www.zskr.cn/news/77381.html

相关文章:

  • IDEA的AI帮助写代码得插件
  • 2025年五大锤式破碎机品牌排行榜,新性能测评与安全保养指南
  • 2025年本地 GEO 公司哪家靠谱?:专业测评精选指南
  • 2025年全国知名 GEO 公司有哪些?:权威报告与攻略发布
  • 函数式接口
  • 北京翻译服务公司选型决策:2025年12月北京优质翻译服务公司综合实力解析
  • 2025上海商业场所保洁优质品牌推荐指南
  • 2025年最新快充/重卡/商用/电动车/新能源充电桩厂家 TOP5 推荐:技术落地 + 全域服务的实力之选
  • 某中心ICASSP 2022五十余篇论文技术概览
  • jenkins 通过ssh配置 将java应用程序部署到远程服务器
  • selenium常用界面交互操作
  • 大屏适缩放
  • 2025年最新数字人平台权威排行榜:全方位深度测评与精选推荐
  • 苏州永创智能科技详解“CMTI测试电源”共模瞬态抗扰度测试方案及标准 - FORCREAT
  • 2025年靠谱的 GEO 公司推荐:官方深度测评必读
  • 2025年度十大竹制家具供应商排行榜,竹制品厂家哪家好
  • 2025年中国全域外卖服务商排行榜:全域外卖招商有哪家?
  • 2025年葡萄牙名义雇主EOR公司推荐,Safeguard Global人力资源服务商助力企业合规雇佣
  • 2025年抖音外卖服务商TOP5推荐:斯创全域外卖售后服务与
  • CF2009E-Klees SUPER DUPER LARGE Array!!!
  • 2025 年 12 月 GEO 服务商精选:深度实测的靠谱企业名单
  • 2025 南美名义雇主 EOR 服务商推荐:Safeguard Global 合规用工优选
  • 2025年中国数字文化展馆设计公司TOP5推荐:国创展览发展
  • 实用指南:Kubernetes 第四章:深入掌握Service-基础
  • 2025实力强的全域外卖运营商TOP5权威推荐:高性价比的全
  • 2025年12月储罐厂家最新推荐,认准环宇化工,PP储罐、PPH储罐、PP搅拌罐、PHP搅拌罐、聚丙烯储罐、聚丙烯搅拌罐、真空储罐、PP真空储罐、PPH真空储罐、全系列防腐储罐安全靠谱
  • 详细介绍:React Native CLI的搭建
  • 2025数字文化展馆服务商TOP5权威测评:国创展览的规模怎
  • 2025年10月制造业企业管理咨询公司推荐:专业评测排行榜详细发布
  • 2025年10月制造业企业管理咨询公司推荐:权威机构综合评测与排名