JavaScript 中的闭包和事件委托

embedded/2024/11/17 5:29:54/
包 (Closures)

闭包是 JavaScript 中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕。闭包可以帮助我们实现数据的私有化、封装和模块化,使代码更简洁、易读和可维护。

闭包的定义

简单来说,闭包是指有权访问另一个函数作用域中变量的函数。

function outerFunction() {let outerVariable = "I am outside!";function innerFunction() {console.log(outerVariable); // innerFunction 可以访问 outerVariable}return innerFunction;
}const closure = outerFunction();
closure(); // 输出: I am outside!

在上述例子中,innerFunction 就是一个闭包,它可以访问 outerFunction 中的 outerVariable,即使 outerFunction 已经执行完毕。

闭包的应用

  1. 数据私有化

function createCounter() {let count = 0;return function() {count++;return count;};
}const counter = createCounter();
console.log(counter()); // 输出: 1
console.log(counter()); // 输出: 2
console.log(counter()); // 输出: 3

在这个例子中,count 变量被封装在 createCounter 函数的作用域内,只能通过返回的闭包函数进行访问和修改。

  1. 模拟块级作用域

在 ES6 之前,JavaScript 没有块级作用域,我们可以使用闭包来模拟块级作用域。

for (var i = 1; i <= 3; i++) {(function(i) {setTimeout(function() {console.log(i);}, i * 1000);})(i);
}
// 输出: 1, 2, 3 (每隔一秒输出一个数字)

通过立即执行函数表达式 (IIFE),为每次循环创建了一个新的作用域,从而使 setTimeout 中的 i 保持正确的值。

事件委托 (Event Delegation)

事件委托是一种利用事件冒泡机制,将事件监听器添加到父元素上,从而管理多个子元素事件处理的一种技术。它可以减少内存占用,提高性能,特别是在需要处理大量动态生成的子元素事件时非常有用。

事件委托的定义

通过将事件监听器添加到父元素上,当子元素的事件被触发时,事件会冒泡到父元素,由父元素的事件监听器进行处理。

<ul id="parent"><li>Item 1</li><li>Item 2</li><li>Item 3</li>
</ul>

document.getElementById('parent').addEventListener('click', function(event) {if (event.target.tagName === 'LI') {console.log(event.target.innerText); // 输出点击的列表项的文本}
});

在这个例子中,我们只为 ul 元素添加了一个点击事件监听器,但可以处理所有 li 元素的点击事件。

事件委托的应用

  1. 动态内容

当页面上有大量动态生成的元素时,使用事件委托可以简化事件处理。

const list = document.getElementById('parent');
document.getElementById('addItem').addEventListener('click', function() {const newItem = document.createElement('li');newItem.innerText = `Item ${list.children.length + 1}`;list.appendChild(newItem);
});

  1. 提高性能

当需要为大量元素添加事件监听器时,事件委托可以显著提高性能,因为只需要为父元素添加一个事件监听器,而不是为每个子元素添加。

<button id="addItem">Add Item</button>
<ul id="parent"><!-- 动态生成的列表项 -->
</ul>

总结

闭包能够访问外部函数作用域中的变量,从而实现数据私有化和封装;

事件委托利用事件冒泡机制,通过将事件监听器添加到父元素上,简化了事件处理,提高了性能。

文章转载自:最小生成树

原文链接:https://www.cnblogs.com/zx618/p/18339486

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


http://www.ppmy.cn/embedded/90829.html

相关文章

移动端支持自定义导航配置

07/31 主要更新模块概览 日程展开 成员组件 字段校验 自定义导航 01 表单管理 1.1 【表单视图】-日历视图-日程表-全天日程新增展开功能 在日历视图中&#xff0c;日程表-全天日程新增展开功能&#xff0c;默认只显示2条日程&#xff0c;超出部分可以点击展开按钮显示…

Hyper-V创建虚拟机安装OpenEulerOS

文章目录 下载OpenEulerHyper-V创建虚拟机 下载OpenEuler 进入官网下载&#xff0c;我选择的是 openEuler 24.03 LTS &#xff0c;选择第一个版本即可&#xff1a; Hyper-V创建虚拟机 点击新建->虚拟机&#xff1a; 点击下一步&#xff1a; 输入虚拟机名称&#xff0c…

排序算法:插入排序,golang实现

目录 前言 插入排序 代码示例 1. 算法包 2. 插入排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 插入排序的思想 循环细节 外层循环 内层循环 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行排序 假如 30 条数据进行排序 假设 5000 条数据&…

C++——智能指针

前言&#xff1a;哈喽小伙伴们&#xff0c;今天我们继续来分享C的一个全新知识——智能指针。 目录 一.何为智能指针 RAII 二.智能指针的种类 三.内存泄漏 结语 一.何为智能指针 RAII RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种利用对象生…

电影票房数据的获取,可以控制数量,并导出表格或csv

#本文仅供学习交流之用 import json import requests import pandas as pdheaders {Accept: application/json, text/plain, */*,Accept-Language: zh-CN,zh;q0.9,Cache-Control: no-cache,Connection: keep-alive,Content-Type: application/x-www-form-urlencoded,Origin: h…

Stable Diffusion绘画 | 图生图-基础使用介绍—重绘幅度与缩放模式

重绘幅度 重绘幅度越大&#xff0c;出图与原图差异越大。 重绘幅度0.7 重绘幅度0.3 缩放模式 目前有以下四种缩放模式&#xff1a; 原图的宽高是1080x1440&#xff0c;当修改宽高&#xff0c;与原图不一致时&#xff0c;可选择其中一种缩放模式来处理图片。 仅调整大小 缩放…

基于Matlab的疲劳检测系统设计与实现

基于Matlab的疲劳检测系统设计与实现 一、引言 1. 阐述疲劳驾驶的危害性及对交通安全的影响。 2. 强调疲劳检测系统的重要性和现实意义。 3. 介绍本文的主题&#xff1a;基于Matlab的疲劳检测系统设计与实现。 二、系统设计 1. 系统总体架构设计 t- 输入模块&#xff1a;负…

javaEE和javaSE

引用自&#xff1a;https://developer.baidu.com/article/detail.html?id3312755 文章目录 前景描述javaSE简介使用场景 javaEE&#xff08;J2EE&#xff09;简介使用场景 结语 前景描述 javaEE和javaSE是java中比较常见的两个概念,但是又比较容易忘记&#xff0c;在此进行记…