JS中的闭包_闭包通常用来间接访问一个变量,如果这个变量定义在全局,全局变量容易污染-程序员宅基地

技术标签: 面试  JS  js  javascript  

在这里插入图片描述
1.什么是闭包?
2.闭包的作用是什么?

首先我们来简述一下:什么是闭包?

function foo() {
    
  var a = 2    
  function bar() {
    
    console.log(a);
  }
  bar()
}
foo()

在上面的代码中,函数foo被执行,进而函数bar被定义且执行。
此时的函数bar可以访问到变量a

这就是一个闭包:
「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包

那来到第二个问题:闭包的作用是什么?

闭包常常用来「间接访问一个变量」。或者说,「隐藏一个变量」。
假设在一个支付软件中,我们需要定义用户当前的资金总量,这个数字在很多地方都需要被访问到,如果不用闭包,或许我们能用一个全局函数?

window.money = 4396.00

不,这样看起来很不妥。万一有人不怀好意把这个数改成7或者7777777了怎么办?

所以我们不能让别人直接访问这个变量,我们,得用局部变量了。

但是用局部变量别人又访问不到,怎么办呢?

我们可以使用闭包,暴露一个函数,实现一个共有变量

代码如下:

 function change() {
    
  var money = 4396.00     
  function bar() {
    
    console.log(money);
  }
  return bar
}
var result = change()
result()
result()
result()

延伸

闭包的缺陷

闭包会导致一定程度的内存泄漏:
主流浏览器中都有一个JS执行引擎,其中有一个回收机制,回收机制会定时删除不必要的冗杂数据。
但是回收机制无法回收闭包的函数,及闭包函数中存储的数据。这就会使得浏览器需要更多性能方面的开销。

闭包的其他作用

1.做缓存,能让多个函数同时作用于一个对象
2.实现封装,让属性能够私有化
3.在模块化开发中,能防止污染全局变量

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45698096/article/details/116003910

智能推荐

python环境argparse库在vsCode中使用Tips_argparse vscode-程序员宅基地

文章浏览阅读1.3k次。文章目录SystemExit报错argparse库SystemExit报错==解决VScode中argparse配置问题。原因:argparse库是用于接受从command-lines传来参数的库,但在VScode中并不需要从command-lines来配置参数。解决:可以通过如下操作,实现在VScode中配置参数、调试带参数的python程序,参数设置方式如下:Run->open Configurations,打开lanuch.json。或者直接打开.vscode文件,点开launch_argparse vscode

Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。_数据库基本查询语句-程序员宅基地

文章浏览阅读2k次,点赞52次,收藏20次。select * from tt4 where name like '%三';或者在X前面写够17个下划线也可以查询到。_数据库基本查询语句

Python「Word2vec」:训练词向量时,准确度太低的问题反思_word2vec训练数据太少-程序员宅基地

文章浏览阅读3.5k次,点赞6次,收藏16次。最近在做毕设的原因,使用到了 python 的 word2vec 模块,将大批量文本进行训练生成的词向量存在明显的准确度太低的情况(例如查找与某个词相似的 top10,给出的结果总是乱七八糟),这里找到了原因,做一下简单记录。_word2vec训练数据太少

Docker轻量级图形页面管理之DockerUI_轻量级 dockerui-程序员宅基地

文章浏览阅读308次。Docker轻量级图形页面管理之DockerUI1、查看dockerui镜像docker search dockerui[root@centos8 ~]# docker search dockeruiNAME DESCRIPTION STARS OFFICIAL AUTOMATEDuifd/ui-for-docker A web inter_轻量级 dockerui

【数据库领域】select子句顺序_select语句的各个子句书写顺序-程序员宅基地

文章浏览阅读298次。子句 说明 是否必须使用 select 要返回的列或表达式 是 from 从中检索数据的表 仅在从表选择数据时使用 where 行级过滤 否 group by 分组说明 仅在按组计算聚集时使用 having 组级过滤 否 order by 输出排序顺序 否 limit 要检索的..._select语句的各个子句书写顺序

随便推点

error LNK2019: 无法解析的外部符号_无法解析的外部符号 "public: virtual bool __cdecl cv::videoc-程序员宅基地

文章浏览阅读7w次,点赞24次,收藏106次。错误描述 1>11_ObjectDetection.obj : error LNK2019: 无法解析的外部符号 “public: __cdecl cv::VideoCapture::VideoCapture(void)” (??0VideoCapture@cv@@QEAA@XZ),该符号在函数 main 中被引用 1>11_ObjectDetection.obj : error ..._无法解析的外部符号 "public: virtual bool __cdecl cv::videocapture::read

58 张图,手把手教会你 Simscape Multibody 物理建模与刚体变换!-程序员宅基地

文章浏览阅读2.1w次,点赞52次,收藏261次。作者 |安布奇责编 | 胡巍巍本文干货满满,主要以一个单摆为例,讲述如何进行物理建模。58张实操图,手把手带你学会Simscape Multibody物理建模与刚体变换!创建模型在MatLab命令行输入smnew,打开一个新的simscape multibody项目。在命令行输入sm_lib,打开Simscape Multibody b..._simscape参数怎样修改

centos7使用docker命令安装java-1.8 + tomcat + mysql+部署springboot项目_centos7 docker 安装mysql java 打包-程序员宅基地

文章浏览阅读1.3k次。1. java-1.8安装 1.1 首先我们通过yum命令下载jdk(默认会是最新版本) yum install java-1.8.0-openjdk* -y 如果没有yum命令则通过以下命令安装 rpm -ivh yum-.noarch.rpm 在第一次启用yum之前首先需要导入系统的RPM-GPG-KEY: 1.2 安装完后可以通过以下命令进行查看(使用yum install ..._centos7 docker 安装mysql java 打包

如何在uniapp中使用uviewUI-适合uniapp的ui组件_uniapp使用uview-程序员宅基地

文章浏览阅读2.1k次。uView是uni-app生态专用的UI框架,uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码, 可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台(引言自uni-app网)。a、先打开uview的插件地址:https://ext.dcloud.net.cn/plugin?c、导入后,在弹出的对话框中选择要导入的项目,这样就会在该项目中自动生成一个。a、在引入uView的全局SCSS主题文件。在main.js中引入。_uniapp使用uview

pptp连接服务器无响应,解决PPTP客户端拨号不成功-程序员宅基地

文章浏览阅读3.9k次。一、检查网络连通性在客户端电脑,使用ping 命令检测线路连通性,方法:打开电脑的命令提示符,光标闪烁位置输入ping 183.16.44.206 (服务器地址或域名),如果无法ping通,请检查路由器设置或宽带线路问题。注意:我司部分路由器在攻击防护中,默认有勾选“防止WAN口Ping”的功能,需先关闭后再测试。二、检查客户端设置1、检查服务器地址(IP地址或域名)找到客户端,右键 并选择 属性..._pptp 无法连接

计算图像R、G、B三色的直方图_ckimage exposure.histogram r g b 直方图-程序员宅基地

文章浏览阅读1.3k次。VS2010+Opencv2.4.6_ckimage exposure.histogram r g b 直方图

推荐文章

热门文章

相关标签