深入理解JS的执行上下文、词法作用域和闭包(中)

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 三、闭包 🔒
    • 闭包的定义和特点
    • 如何创建和使用闭包 🚀
    • 闭包在实际编程中的应用场景 💡

三、闭包 🔒

闭包的定义和特点

闭包(Closure)是JavaScript中一种重要的概念,它指的是一个函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。闭包的主要特点有以下几点:

  1. 函数可以记住并访问其词法作用域:当一个函数在其词法作用域之外执行时,它仍然可以访问其词法作用域中的变量。

例如:

function foo() {let a = 1;function bar() {console.log(a); // 输出 1}bar();
}foo();

在这个例子中,bar函数在其词法作用域foo之外执行,但仍然可以访问foo作用域中的变量a

  1. 闭包可以让函数记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁:当一个函数在其词法作用域之外执行时,即使这个作用域在函数执行完毕后被销毁,该函数仍然可以访问其词法作用域中的变量。

例如:

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

在这个例子中,createCounter函数返回一个闭包counter,每次调用counter时,它会访问其词法作用域createCounter中的变量count,即使createCounter函数执行完毕并销毁。

总结:闭包是JavaScript中一种重要的概念,它指的是一个函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。闭包的主要特点包括函数可以记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁。理解闭包有助于更好地理解JavaScript中的变量作用域和函数调用等问题。

如何创建和使用闭包 🚀

闭包(Closure)是JavaScript中一种重要的概念,它指的是一个函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。下面介绍如何创建和使用闭包:

  1. 创建闭包:

在JavaScript中,闭包是由函数引用其词法作用域中的变量创建的。当一个函数在其词法作用域之外执行时,它仍然可以访问其词法作用域中的变量。

例如,下面的代码创建了一个闭包:

function foo() {let a = 1;function bar() {console.log(a); // 输出 1}bar();
}foo();

在这个例子中,bar函数在其词法作用域foo之外执行,但仍然可以访问foo作用域中的变量a

  1. 使用闭包:

闭包可以让函数记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁。当一个函数在其词法作用域之外执行时,即使这个作用域在函数执行完毕后被销毁,该函数仍然可以访问其词法作用域中的变量。

例如,下面的代码使用了闭包:

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

在这个例子中,createCounter函数返回一个闭包counter,每次调用counter时,它会访问其词法作用域createCounter中的变量count,即使createCounter函数执行完毕并销毁。

总之,闭包是JavaScript中一种重要的概念,它指的是一个函数可以访问其词法作用域中的变量,即使这个函数在其词法作用域之外执行。创建闭包需要函数引用其词法作用域中的变量,使用闭包可以让函数记住并访问其词法作用域,即使这个作用域在函数执行完毕后被销毁。实际项目中,可以根据需求灵活地使用闭包。

闭包在实际编程中的应用场景 💡

闭包在实际编程中有很多应用场景,下面列举几个常见的例子:

  1. 模块化:闭包可以用来实现模块化,将一组相关的函数和变量封装在一个函数内部,然后返回这个函数的引用,这样就可以在其他地方调用这些函数并访问它们需要的变量。

例如,使用闭包实现一个简单的模块:

function createCart() {let products = [];function addProduct(product) {products.push(product);}function getProducts() {return products;}return {addProduct,getProducts};
}const cart = createCart();
cart.addProduct({ id: 1, name: 'Product 1' });
console.log(cart.getProducts()); // 输出:[{ id: 1, name: 'Product 1' }]

在这个例子中,createCart函数返回一个闭包,包含addProductgetProducts函数以及它们需要的变量products

  1. 保持状态:闭包可以用来保持函数内部的状态,即使这个函数在其他地方执行。

例如,使用闭包实现一个简单的计数器:

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

在这个例子中,createCounter函数返回一个闭包,每次调用counter时,它会访问其词法作用域createCounter中的变量count,即使createCounter函数执行完毕并销毁。

  1. 实现柯里化(Currying):柯里化是一种将多参数函数转换为一系列使用一个参数的函数的技术。闭包可以让柯里化更加简洁和易读。

例如,使用闭包实现一个简单的柯里化函数:

function curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn.apply(this, args);} else {return function(...args2) {return curried.apply(this, args.concat(args2));};}};
}function sum(a, b, c) {return a + b + c;
}const curriedSum = curry(sum);
const sum5 = curriedSum(5);
console.log(sum5(3)(2)); // 输出 10

在这个例子中,curry函数将一个多参数函数转换为一个闭包,这个闭包可以部分应用(即柯里化)。

总之,闭包在实际编程中有许多应用场景,包括模块化、保持状态、实现柯里化等。实际项目中,可以根据需求灵活地使用闭包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/489996.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【智能车入门:pcb版】(蓝牙遥控、超声波避障、红外循迹)

实现最简单的蓝牙遥控、超声波避障、红外循迹) 总览项目获取 本篇是对 上一篇博客的改进,上一篇博客使用面包板,看起来很乱,春节结束之后嘉立创免费打板恢复,板子到了之后进行焊接测试,相较于使用面包板&a…

HC595级联原理及实例 - STM32

74HC595的最重要的功能就是:串行输入,并行输出。其次,74HC595里面有2个8位寄存器:移位寄存器、存储寄存器。74HC595的数据来源只有一个口,一次只能输入一个位,那么连续输入8次,就可以积攒为一个…

十一、Qt数据库操作

一、Sql介绍 Qt Sql模块包含多个类,实现数据库的连接,Sql语句的执行,数据获取与界面显示,数据与界面直接使用Model/View结构。1、使用Sql模块 (1)工程加入 QT sql(2)添加头文件 …

YOLOv5算法进阶改进(18)— 引入动态蛇形卷积DSConv(ICCV2023 | 用于管状结构分割)

前言:Hello大家好,我是小哥谈。动态蛇形卷积(Dynamic Snake Convolution,简称DSConv)是一种用于图像处理和计算机视觉任务的卷积神经网络(CNN)操作。它是在传统的卷积操作基础上引入了动态蛇形路径的概念,以更好地捕捉图像中的细节和边缘信息。传统的卷积操作是在固定的…

MongoDB之客户端工具与核心概念及基本类型篇

MongoDB之客户端工具与核心概念及基本类型篇 文章目录 MongoDB之客户端工具与核心概念及基本类型篇1. MongoDB是什么?1. 关于MongoDB2. 相关客户端工具1. MongoDB Compass2. Studio 3T3. Navicat for MongoDB4. NoSQL Manager for MongoDB Professional 2.MongoDB相关概念2.1 …

Apache Doris 发展历程、技术特性及云原生时代的未来规划

文章目录 每日一句正能量前言作者介绍Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源基于云原生向量数据库Milvus 的…

Vue.js+SpringBoot开发超市商品管理系统

目录 一、摘要1.1 简介1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品类型…

Python中的functools模块详解

大家好,我是海鸽。 函数被定义为一段代码,它接受参数,充当输入,执行涉及这些输入的一些处理,并根据处理返回一个值(输出)。当一个函数将另一个函数作为输入或返回另一个函数作为输出时&#xf…

使用向量数据库pinecone构建应用06:日志系统异常检测 Anomaly Detection

Building Applications with Vector Databases 下面是这门课的学习笔记:https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题

注意下面的方法只能在app端使用, let wv plus.webview.create("","custom-webview",{plusrequire:"none", uni-app: none, width: 300,height:400,top:uni.getSystemInfoSync().statusBarHeight44 }) wv.loadURL("https://ww…

线程池(ThreadPoolExecutor,as_completed)和scrapy框架初步构建——学习笔记

用法1:map函数 with ThreadPoolExecutor() as pool: results pool.map(craw,utls)for result in results:print(result) 1.Scrapy框架: 五大结构:引擎,下载器,爬虫,调度器,管道&#x…

幻兽帕鲁(Palworld 1.4.1)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 说明 服务器硬件要求:Linux系统/Window系统(x86架构,armbian架构…