JavaScript 惰性函数

文章目录

JavaScript 惰性函数

概述

惰性函数通过函数的自我覆盖 ,实现了延迟执行 和性能优化。

用法

性能优化

不使用惰性函数:

不使用惰性函数,每次调用 addEvent 都会进行一次 if-else 判断,造成额外的性能浪费。

javascript 复制代码
function addEvent(element, type, handler) {
  // 每次调用都要判断一次
  if (element.addEventListener) {
    element.addEventListener(type, handler, false);
  } else if (element.attachEvent) {
    element.attachEvent('on' + type, handler);
  } else {
    element['on' + type] = handler;
  }
}

for (let i = 0; i < 100; i++) {
  const btn = document.createElement('button');
  btn.textContent = `Button ${i}`;
  document.body.appendChild(btn);
  addEvent(btn, 'click', () => alert(`Button ${i} clicked!`));
}

使用惰性函数:

addEvent 函数在第一次被调用时,会根据浏览器特性,用一个最适合的函数版本把自己 "换掉"。后续所有调用都直接执行那个最优版本。

javascript 复制代码
function addEvent(element, type, handler) {
  // 首次调用:执行检测逻辑,并替换原函数
  if (element.addEventListener) {
    addEvent = function(element, type, handler) {
      element.addEventListener(type, handler, false);
    };
  } else if (element.attachEvent) {
    addEvent = function(element, type, handler) {
      element.attachEvent('on' + type, handler);
    };
  } else {
    addEvent = function(element, type, handler) {
      element['on' + type] = handler;
    };
  }

  // 执行新函数
  addEvent(element, type, handler);
}

for (let i = 0; i < 100; i++) {
  const btn = document.createElement('button');
  btn.textContent = `Button ${i}`;
  document.body.appendChild(btn);
  addEvent(btn, 'click', () => alert(`Button ${i} clicked!`));
}

延迟加载

不使用惰性函数:

在代码运行后,对象就会立即被创建,即使不使用也会被创建。

javascript 复制代码
const user = {
    name: "Tom",
    age: 18
}

function getUser() {
    return user;
}

const newUser = getUser()

使用惰性函数:

只有在方法调用时才会创建对象。

javascript 复制代码
let user = null

function getUser() {
    if (user == null) {
        user = {
            name: "Tom",
            age: 18
        }
    }
    return user;
}

const newUser = getUser()
相关推荐
liangshanbo12154 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
默_笙16 小时前
🚦 请三个 AI 考官给 RAG 打分:量化评估实战(下)
前端·javascript
阿坨16 小时前
灵感闪存卡:一款 Tampermonkey用户脚本
javascript·tampermonkey
朝朝辞暮i18 小时前
C++ 第 25 课:getter / setter + this
java·javascript·c++
蜗牛互联网19 小时前
Python接入Gemini 3.8 Flash实现票据视觉抽取与规则校验
java·javascript·网络·人工智能·python
xieter20 小时前
【技术精选】深入浅出现代前端渲染与性能优化实践指南 (2026-10-04)
前端·javascript
xieter20 小时前
【硬核实战】TypeScript Compiler API: Preserving Child Node Narrowing in Reusable Type Guards 🔧 (2026-10-03)
前端·javascript
xieter20 小时前
【硬核实战】React 19 useFormStatus Returning False? I Built a SubmitButton That Fixes It (2026-10-03)
前端·javascript
paopaokaka_luck1 天前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
Highcharts.js1 天前
图表开发实战总结| 7 条“黄金法则”与“性能铁律”
前端·javascript·vue.js·编辑器·时序数据库·highcharts