当前位置: 首页 > news >正文

3.闭包 - JS

作用域

一般认为 JS 中作用域有三种:

  • 全局作用域:一个脚本运行代码的默认作用域;
  • 模块作用域:一个模块运行代码的默认作用域;
  • 函数作用域:一个函数运行代码的默认作用域。

而由于 let/const 声明变量的作用域,是比函数作用域更加具有块级属性的,所以称块级作用域,任何一个 {} 包围的代码都是一个;函数是特殊的块,脚本是一个大的块,模块是多个脚本的集合,是更大的块。

函数是特殊的块?这是由于,函数体内就算是 var 声明的变量,在外部也无法使用,这和其他 {} 构成的块不同。换句话说,var 只承认函数的块级作用域。

/* let/const 声明变量的作用域 */
{ let a = 1; }
console.log(a)		// 报错,块内的变量在外部失效,报未定义的错{ let a = 1 }
{ console.log(a) }	// 报错,此块内没有变量afor (let i = 0; i < 5; i++) {  }
console.log(i)		// 报错,块内的变量在外部失效,报未定义的错for (var i = 0; i < 5; i++) {  }
console.log(i)		// 5 var 只承认函数的块级作用域

闭包

闭包是 JS 中最强大的特性之一。尽管功能强大,但除了完成特定任务时,才会函数嵌套。

概念

JS 允许函数嵌套,且根据 块/函数 的作用域特性(内部可以访问外部声明定义的变量),将外部函数声明的变量等组成的环境一个内部函数组合封装起来,就构成一个闭包

在下面一个简单的计数器例子中,内部函数 counter 和变量 n/init 组成的环境,构成闭包。

注意:返回的函数不能是 new Function 构造出来的(Function 的传参模式是字符串,指向全局环境,无法访问外部函数环境)。

function MakeCounter(init=0) {let val = init;function counter() { return val++; }return counter
}let ctr = MakeCounter(10)
ctr()		// 10
ctr()		// 11
ctr()		// 12

模拟私有方法

由于闭包环境变量的私有性,容易想到用来模拟一些私有方法。

下面一个相对复杂的计数器例子中:私有属性 privateVal 只能通过公共方法 getValue 进行访问;私有方法 changeBy 也只能通过其他公共方法调用。

function MakeCounter(init) {let privateVal = init;function changeBy(delta) { privateVal += delta; };return {getValue() { return privateVal; },increment() { changeBy(1); },decrement() { changeBy(-1); },plus(b) { changeBy(b); },minus(b) { changeBy(-b); },}
}let ctr = MakeCounter(10);
ctr.value()				// 10
ctr.increment()
ctr.plus(9)
ctr.value()				// 20

多个闭包共用一个环境?

将上面计数器的例子小改一下,在返回的对象里增加一个值。

返回时一个对象,包括一个值和五个函数:

  • 五个函数共用一个环境,影响同一个环境;
  • val,在完成返回后,脱离该环境,独立成为一个变量/属性。
function MakeCounter(init) {let privateVal = init;function changeBy(delta) { privateVal += delta; };return {val: PrivateVal,getValue() { return privateVal; },increment() { changeBy(1); },decrement() { changeBy(-1); },plus(b) { changeBy(b); },minus(b) { changeBy(-b); },}
}let ctr = MakeCounter(10);
ctr.getValue()			// 10
ctr.val					// 10
ctr.increment()
ctr.plus(9)
ctr.getValue()			// 20
ctr.val					// 10
ctr.val = 100
ctr.val					// 100

性能考量

  1. 闭包在处理速度和内存消耗方面对脚本性能具有负面影响;
  2. 闭包特性能达到的效果,使用高级语法也能实现;
  3. 高手总是会闭包。

相关文章:

3.闭包 - JS

作用域 一般认为 JS 中作用域有三种&#xff1a; 全局作用域&#xff1a;一个脚本运行代码的默认作用域&#xff1b;模块作用域&#xff1a;一个模块运行代码的默认作用域&#xff1b;函数作用域&#xff1a;一个函数运行代码的默认作用域。 而由于 let/const 声明变量的作用…...

Java实现批量视频抽帧2.0

继上个版本 对其进行略微升级 &#x1f913; 上个版本仅对一个视频进行抽帧处理 此版本可对一个文件夹内的全部视频进行抽帧并对应的文件夹进行帧图片的保存 1️⃣配置pom.xml &#xff08;保持上次不变&#xff09; <dependencies><dependency><grou…...

MFC 原生LsitCtrl单元格嵌入图标

// ListItemInsertIconDlg.h: 头文件 //#pragma once// CListItemInsertIconDlg 对话框 class CListItemInsertIconDlg : public CDialogEx { // 构造 public:CListItemInsertIconDlg(CWnd* pParent nullptr); // 标准构造函数// 对话框数据 #ifdef AFX_DESIGN_TIMEenum { IDD…...

黑马头条 - minio

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…...

认识Tomcat (一)

认识Tomcat &#xff08;一&#xff09; 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…...

SSH免密切换服务器案例-ssh协议(公钥和私钥)

公钥和私钥理解 公钥提供加密&#xff0c;私钥解密&#xff0c;公钥可以共享&#xff0c;私钥不可以。举例公钥相当于锁头&#xff0c;可以给别人用&#xff0c;钥匙相当于私钥&#xff0c;只能开自己发出去的锁头&#xff0c;也就是私钥和公钥成对&#xff0c;私钥只能解密对…...

AMH面板如何安装与公网远程访问本地面板界面

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【教3妹学编程-算法题】1696. 跳跃游戏 VI

3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2哥 : 没想到都立春了还这么冷啊~ 3妹&#xff1a;暴雪、冻雨、大雨&#xff0c;这天气还让不让人活啦&#xff01;&#xff01;&#xff01; 2哥 :哎&#xff0c;好多人都滞留的高铁站了&#xff0c;没法回家了 3妹&#xf…...

解决C#中无限递归导致的System.StackOverflowException异常

目录 背景&#xff1a; 错误示例分析: 为什么是错误的&#xff1f; 正确的使用递归&#xff1a; 修改后的代码&#xff1a; 原理和原因&#xff1a; 结论&#xff1a; 背景&#xff1a; 在软件开发中&#xff0c;递归是一种常见的编程技术&#xff0c;它允许方法调用自…...

ASP.NET Core 预防开放式重定向攻击

写在前面 为预防钓鱼网站的常用套路&#xff0c;在进行 Web 应用程序的开发时&#xff0c;原则上应该将所有由用户提交的数据视为不可信。如果应用程序中包含了基于 URL 内容重定向的功能&#xff0c;需要确保这种类型的重定向操作只能在应用本地完成&#xff0c;或者明确判断…...

HashCat 恢复Excel、Word、PPT密码保姆教程

HashCat 恢复Excel、Word、PPT密码 一、流程 整体需要两个步骤 先用office2john.py获取下文件的hash值 python office2john.py 1.xlsx > hash这个命令需要你电脑有python环境&#xff0c;然后在cmd命令窗口中执行此命令就行 文件链接&#xff1a;https://github.com/magnu…...

flink实战--flink的job_listener使用解析

背景 生产环境可能有如下的需求:当一个flink作业提交完成或者是运行中不定时给我们触发某个接口或发送一个消息,然后我们在做其他的操作,尤其是batch作业。 flink的job_listener就可以满足我们监听flink任务提交和运行状态的需求,具体如何使用本文将全面介绍一下。 注册入…...

ASR 概述

前言 随着企业加强了与客户的线上沟通&#xff0c;企业越发依赖于虚拟助手、聊天机器人以及其他的语音技术&#xff0c;以实现与客户的高效互动。这几类人工智能&#xff0c;都是依赖于自动语音识别技术&#xff0c;简称为 ASR。ASR 涉及到将语音转换为文本&#xff0c;促使计…...

聊聊比特币----比特币地址

⽐特币地址是⼀个标识符&#xff08;帐号&#xff09;&#xff0c;包含27-34个字母数字拉丁字符&#xff08;0&#xff0c;O&#xff0c;I除外&#xff09;。地址可以以QR码形式表⽰&#xff0c;是匿名的&#xff0c;不包含关于所有者的信息。 地址⽰例&#xff1a;14qViLJfdG…...

(4)【Python数据分析进阶】Machine-Learning模型与算法应用-回归、分类模型汇总

线性回归、逻辑回归算法应用请参考: https://codeknight.blog.csdn.net/article/details/135693621https://codeknight.blog.csdn.net/article/details/135693621本篇主要介绍决策树、随机森林、KNN、SVM、Bayes等有监督算法以及无监督的聚类算法和应用PCA对数据进行降维的算法…...

Python 调用 OpenAI ChatGPT API

一、安装环境1. 安装python环境 $ pip install openai 2. 验证是否安装成功 方法1&#xff0c;bash命令验证 $ pip show openai 方法2&#xff0c;python脚本验证 import openai print(openai.__version__) 3. 找到你的 OpenAI API Key&#xff1a;进入OpenAI官网&#xff0…...

springboot155基于JAVA语言的在线考试与学习交流网页平台

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...

echarts使用之地图(五)

1 基本使用 百度地图 API : 使用百度地图的 api , 它能够在线联网展示地图 , 百度地图需要申请 ak 矢量地图 : 可以离线展示地图 , 需要开发者准备矢量地图数据。本文使用该方式。 json格式的数据如下&#xff1a; 格式参照&#xff1a;GeoJSON <!DOCTYPE html&…...

【已解决】青龙面板依赖安装失败原因

青龙面板必须安装依赖&#xff0c;才可以执行脚本&#xff0c;这是不争的事实。 如果脚本跑不起来&#xff0c;就去看看依赖吧。 NodeJs 依赖如下 axios request canvas cheerio js-base64 dotenv magic tough-cookie ws7.4.3 require requests date-fns ts-md5 typescript j…...

[Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例

什么是无监督学习&#xff1f; 无监督学习是机器学习中的一种方法&#xff0c;其主要目的是从无标签的数据集中发现隐藏的模式、结构或者规律。在无监督学习中&#xff0c;算法不依赖于任何先验的标签信息&#xff0c;而是根据数据本身的特征和规律进行学习和推断。无监督学习…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

边缘计算网关提升水产养殖尾水处理的远程运维效率

一、项目背景 随着水产养殖行业的快速发展&#xff0c;养殖尾水的处理成为了一个亟待解决的环保问题。传统的尾水处理方式不仅效率低下&#xff0c;而且难以实现精准监控和管理。为了提升尾水处理的效果和效率&#xff0c;同时降低人力成本&#xff0c;某大型水产养殖企业决定…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理&#xff1a;检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目&#xff1a;RankRAG&#xff1a;Unifying Context Ranking…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...