首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

JavaScript 中的闭包和事件委托

编程知识
2024年08月02日 18:41

包 (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>

 

总结

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

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

 

From:https://www.cnblogs.com/zx618/p/18339486
本文地址: http://www.shuzixingkong.net/article/723
0评论
提交 加载更多评论
其他文章 万字干货:从消息流平台Serverless之路,看Serverless标准演进
摘要:如今,Serverless化已经成为消息流平台发展的新趋势,而如何更好地基于Serverless化的消息流平台进行应用设计和开发,则成为了一个值得思考的问题。 本文分享自华为云社区《9000字干货:从消息流平台Serverless之路,看Serverless标准演进》,作者:华为云PaaS服务
万字干货:从消息流平台Serverless之路,看Serverless标准演进 万字干货:从消息流平台Serverless之路,看Serverless标准演进 万字干货:从消息流平台Serverless之路,看Serverless标准演进
【VMware VCF】VMware Cloud Foundation Part 06:部署 VI 工作负载域。
VMware Cloud Foundation 标准架构中,管理域和 VI 工作负载域需要分开部署,管理域是初始构建(Bring-up)中部署的一个工作负载域并且只有一个,管理域专门用于承载管理相关组件虚拟机。之前文章(VMware Cloud Foundation Part 05:部署 SDDC
【VMware VCF】VMware Cloud Foundation Part 06:部署 VI 工作负载域。 【VMware VCF】VMware Cloud Foundation Part 06:部署 VI 工作负载域。 【VMware VCF】VMware Cloud Foundation Part 06:部署 VI 工作负载域。
ByteHouse高性能向量检索实践——“以图搜图”
ByteHouse 致力于实现全场景引擎覆盖,以确保实现整体数据效能的最大化产出。除了支持向量检索能力的Vector引擎,ByteHouse还具有全文检索引擎、GIS引擎在内的全场景引擎,为用户提供一体化数据分析服务。
ByteHouse高性能向量检索实践——“以图搜图” ByteHouse高性能向量检索实践——“以图搜图” ByteHouse高性能向量检索实践——“以图搜图”
Win11不在C盘安装WSL2(Linux环境),安装Nvidia驱动和默认使用Win11的网络代理服务
众所周知,WSL 2 为 Windows 用户提供了一个强大、高效且灵活的 Linux 环境,特别适合开发者使用。它结合了 Windows 和 Linux 的优点,为用户提供了更加全面和高效的工作环境。但缺点也很明显,那就是默认安装在本来空间就不富裕的C盘。 本次我们在非C盘的盘符快速安装
Win11不在C盘安装WSL2(Linux环境),安装Nvidia驱动和默认使用Win11的网络代理服务 Win11不在C盘安装WSL2(Linux环境),安装Nvidia驱动和默认使用Win11的网络代理服务 Win11不在C盘安装WSL2(Linux环境),安装Nvidia驱动和默认使用Win11的网络代理服务
算法·理论:KMP 学习笔记
\(\text{KMP}\) 笔记! 上次比赛,出题人出了一个 \(\text{KMP}\) 模板,我敲了个 \(\text{SAM}\) 跑了,但是学长给的好题中又有很多 \(\text{KMP}\),于是滚回来恶补字符串基本算法。 \(\text{KMP}\) 是上个寒假学的,为什么最近才完全理
算法·理论:KMP 学习笔记
告别痕迹:远程桌面连接历史和凭据的清零指南
本文指出在工作中运用 Windows 远程桌面工具时,因安全与隐私因素,有时需删除连接的历史记录和凭据。文中给出了一个相关的 PowerShell 脚本,还说明了其使用方法,涵盖运行 PowerShell 的条件、CredentialManager 模块的安装、脚本的执行流程及输入选择等,同时提到了
【Java】Jsoup 解析HTML报告
一、需求背景 有好几种报告文件,目前是人肉找报告信息填到Excel上生成统计信息 跟用户交流了下需求和提供的几个文件,发现都是html文件 其实所谓的报告的文件,就是一些本地可打开的静态资源,里面也有js、img等等 二、方案选型 前面老板一直说是文档解析,我寻思这不就是写爬虫吗.... 因为是在现
【Java】Jsoup 解析HTML报告 【Java】Jsoup 解析HTML报告 【Java】Jsoup 解析HTML报告
VirtualBox扩容CentOS-7虚拟机磁盘
1、背景描述 如上图所示,根路径“/”所在的文件系统已没有可用的磁盘空间,需要扩容磁盘。 df -h 2、VirtualBox操作 2.1、查看当前虚拟磁盘的大小 如上图所示,点击打开选中的虚拟机的 Settings 界面。 如上图所示,当前虚拟机的虚拟磁盘大小为 8GB 。 2.2、修改虚拟磁盘的
VirtualBox扩容CentOS-7虚拟机磁盘 VirtualBox扩容CentOS-7虚拟机磁盘 VirtualBox扩容CentOS-7虚拟机磁盘