深入理解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.mzph.cn/news/699867.shtml

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

相关文章

.NET指定图片地址下载并转换Base64字符串

需求描述 需要调用第三方图片上传接口上传图片,对方图片格式只能接收Base64字符串。所以我们需要将系统服务器的图片通过Url下载下来,然后转换成Base64字符串。接下来我们将使用HttpClient类库下载图片并将其转换为Base64格式的字符串。 代码示例 /// &…

新手入门C语言之移位操作符和位操作符

在C语言中,移位操作符和位操作符是专门针对二进制的数字进行,因此,在描述移位操作符和位操作符之前,我们先来了解十进制,二进制,八进制,十六进制等的含义以及相互之间的转化。 一.进制以及相互…

《隐私计算简易速速上手小册》第7章:隐私计算与云计算/边缘计算(2024 最新版)

文章目录 7.1 云计算中的隐私保护7.1.1 基础知识7.1.2 主要案例:使用 Python 实现云数据的安全上传和访问7.1.3 拓展案例 1:实现基于角色的访问控制7.1.4 拓展案例 2:使用 Python 保护 API 安全7.2 边缘计算的隐私问题7.2.1 基础知识7.2.2 主要案例:使用 Python 实现边缘设…

Flink join详解(含两类API及coGroup、connect详解)

Flink SQL支持对动态表进行复杂而灵活的连接操作。 为了处理不同的场景,需要多种查询语义,因此有几种不同类型的 Join。 默认情况下,joins 的顺序是没有优化的。表的 join 顺序是在 FROM 从句指定的。可以通过把更新频率最低的表放在第一个、…

使用yolo-seg模型实现自定义自动动态抠图

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。 YOLOv8(附带各种任务详细说明链接) …

DFT系列文章之 《BIST技术》

BIST:BIST是在设计时在电路中植入相关功能电路用于提供自我测试功能的技术,以此降低器件测试对自动测试设备(ATE)的依赖程度。 ATE:ATE是Automatic Test Equipment的缩写,根据客户的测试要求、图纸及参考方…

Element table 实现表格行、列拖拽功能

安装包 npm install sortablejs --save <template><div class"draggable" style"padding: 20px"><el-table row-key"id" :data"tableData" style"width: 100%" border><el-table-columnv-for"(it…

VS中使用xcopy生成后命令报9009错误

错误现象: download下来的代码&#xff0c;在另一台电脑能使用生成后命令xcopy&#xff0c;换一台电脑后该命令不能使用&#xff0c;报如下错误&#xff1a; 2.错误原因&#xff1a; 这是因为xcopy /Y 为Windows程序命令&#xff0c;xcopy其实是Windows下的一个xcopy.exe,如果…

nginx 模块 常见内置变量 location

一、nginx 模块 ngx_http_core_module 核心模块 ngx_http_access_module 访问控制模块 deny allow ngx_http_auth_basic_module 身份验证 小红小名&#xff08;虚拟用户&#xff09; ftp也有虚拟用户 ngx_http_gzip_module 压缩模块 ngx_http_gzip_static_modul…

Java 学习和实践笔记(19):this的使用方法

this用来指向当前对象的地址。 this的用法&#xff1a; 1&#xff09;在普通方法中&#xff0c;this总是指向调用该方法的对象。在普通方法中&#xff0c;它是作为一种隐式参数一直就存在着&#xff08;这句话的意思&#xff0c;就是其实在普通方法中&#xff0c;编译器一直就…

【前端素材】推荐优质后台管理系统Be admin平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

从零开始学逆向:理解ret2syscall

1.题目信息 链接&#xff1a;https://pan.baidu.com/s/19ymHlZZmVGsJHFmmlwww0w 提取码&#xff1a;r4el 首先checksec 看一下保护机制 2.原理 ret2syscall 即控制程序执行系统调用来获取 shell 什么是系统调用&#xff1f; 操作系统提供给用户的编程接口是提供访问操作系统…

电路设计(28)——交通灯控制器的multisim仿真

1.功能设定 南北、东西两道的红灯时间、绿灯时间均为24S&#xff0c;数码管显示倒计时。在绿灯的最后5S内&#xff0c;黄灯闪烁。有夜间模式&#xff1a;按下按键进入夜间模式。在夜间模式下&#xff0c;数码管显示计数最大值&#xff0c;两个方向的黄灯不停闪烁。 2.电路设计 …

【k8s资源调度-StatefulSet】

1、部署对象StatefulSet资源&#xff08;无状态应用&#xff09; StatefulSet针对的是有状态应用&#xff0c;有状态应用会对我们的当前pod的网络、文件系统等有关联。 2、配置文件如下 StatefulSet资源的配置文件粗略如下&#xff0c;如下的配置信息包含了数据卷&#xff0c;…

uniapp_微信小程序自定义顶部导航栏和右侧胶囊对齐(不对齐来打我)

一、想要的效果 思路首先开启自定义导航栏&#xff0c;取消自带的导航栏&#xff0c;然后计算胶囊的高度和标题对齐 二、成品代码 1、首先再你需要居中的代码添加以下style <view class"header":style"{paddingTop:navBarTop px,height:navBarHeight px,…

GitLab代码库提交量统计工具

1.说明 统计公司所有项目的提交情况&#xff0c;可指定分支和时间段&#xff0c;返回每个人的提交新增数、删除数和总数。 2.API 文档地址&#xff1a;http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例&#xff1a; [{"id": 1, //项目ID"http…

机器学习——线性回归算法、代价函数、梯度下降算法基础

线性回归 还是以之前的预测房价为例&#xff0c;根据不同尺寸的房子对应不同的售价组成的数据集画图&#xff0c;图如下 监督学习算法工作流程 假设函数其实就是我们所说的函数&#xff0c;在房价这个例子中&#xff0c;我们可以从上图中看出房价和房子面积是一个一元的线性函…

【进程地址空间】

目录 上层用户看到的地址父进程创建子进程对代码区的同一变量修改 进程地址空间进程地址空间需要划分 页表 上层用户看到的地址 一个系统中的进程是与其他进程共享内存和CPU的。如果某个进程不小心写入另一个使用该内存的进程&#xff0c;进程就可能以某种完全和程序逻辑无关的…

Apache Commons开源的工具库介绍

Apache Commons 是 Apache 软件基金会主持的一个项目&#xff0c;旨在提供一系列可重用的 Java 组件。这些组件覆盖了从数据封装、文本处理到网络通信等各个方面&#xff0c;是 Java 开发中常用的一系列工具库。Apache Commons 项目下的各个库通常以 "commons-" 开头…

css3实现动画无限循环

要在CSS3中实现动画的无限循环&#xff0c;你可以使用animation 属性和 infinite 关键字。以下是一个示例&#xff1a; keyframes myAnimation {0% { /* 起始状态 */ }50% { /* 中间状态 */ }100% { /* 结束状态 */ }}.element {animation: myAnimation 2s infinite; /* 设置动…