JS中的闭包_it棉被的博客-程序员宅基地

技术标签: 面试  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

智能推荐

响应服务器auth first,普通邮箱设置客户端授权码并开启stmp服务以及关于QQ邮箱“命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !”问题全指..._Lele Feng的博客-程序员宅基地

Zoomla!逐浪CMS带有强大的邮局功能,可以用于发送邮件与进行事务管理。其中邮局配置大家不太熟悉这里提供一系列教程。1、首先在QQ邮箱当中开启“POP3/SMTP服务”2、获取“授权码”刚开始一直使用邮箱的密码。后面才发现,原来QQ邮箱通过第三方发送邮件应该使用授权码 o(≧口≦)o网易邮箱也是相同的设置:3、编码使用SmtpClient来解决EnableSsl设置为trueUseDefaul...

聊城java开发薪资_聊城学java,聊城学java报班,聊城学java一般工资能拿多少_仙乔的博客-程序员宅基地

聊城学java,聊城学java报班,聊城学java一般工资能拿多少首页 > java > 聊城学java作者:镀金池发布时间:2017-11-23 19:18Floppy.java 用于完成虚构软盘。谙练把握H5,CSS3,Javascript,Ajax。Android是用Java开发,其静态变量的性命周期遵照Java的设计。聊城学java报班Ionic is the open ...

python怎么安装包-安装python第三方包_weixin_37988176的博客-程序员宅基地

20190822先说一下,有4种方法(我知道的):1.源码安装2.python自带包管理器安装3.外部包管理器安装4.whl格式安装1。源码安装Python第三方库几乎都可以在github或者 pypi上找到源码。源码包格式大概有zip 、 tar.zip、 tar.bz2。解压这些包,进入解压好的文件夹,通常会有一个setup.py的文件。打开命令行,进入该文件夹。运行以下命令,就能把这个第三库...

python检测刀具_科研一角|Python语言在人工智能加工中心机器人方面的应用_汪湜的博客-程序员宅基地

(二)Python在智能数控机床编程技术中的应用用Python给数控机床编写的加工程序能够指令数控机床完成正常的工件安装、对刀、换刀、切削加工、松开夹具;加工程序能够在互联网、共享工业云上传送信息;加工程序能够通过互联网远程控制数控机床完成切削加工。利用人工智能的搜索技术寻找数控机床加工零件时刀具的最佳运动轨迹,选择正确的加工方法和加工指令。利用A*算法计算最佳的基点坐标、切削速度、进给速度、背吃...

mysql5.7安装怎么运行_mysql5.7安装运行的方法_wesinnn的博客-程序员宅基地

mysql5.7安装运行的方法发布时间:2020-11-16 10:52:39来源:亿速云阅读:88作者:小新这篇文章给大家分享的是有关mysql5.7安装运行的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。mysql5.7安装运行的方法:首先将安装包解压到某个目录下,并初始化数据库;然后设置root随机密码,并启动mysqld服务;接着登录Mysql并重置root...

习题6-6 使用函数输出一个整数的逆序数 (20 分)_公子小白呀的博客-程序员宅基地

本题要求实现一个求整数的逆序数的简单函数。函数接口定义:int reverse( int number );其中函数reverse须返回用户传入的整型number的逆序数。我的代码:int reverse( int number ){ int n = number,res = 0,t = 0; n = (n>=0)?n:-n; while(n != 0) { t = n%10; res = 10*res + t;

随便推点

qt找不到打印机_Qt无法调起打印机问题(QPrintDialog: Cannot be used on non-native printers)解决..._weixin_39987138的博客-程序员宅基地

使用Qt编写的打印程序,在Debug下一切正常,准备要发布了,生成了Release下的exe,拷贝好了各种依赖库(也包括打印需要的Qt5PrintSupport.dll),可是当双击程序运行时,打印程序却调不起来,打印机设置对话框出不来,程序也无法进行打印。在QtCreator中进行调试,将构建改为Release模式,运行程序,发现在输出栏输入这么一行提示:“QPrintDialog: Canno...

虚拟主机实现php定时任务,深入php定时计划任务的实现方法详解_餘弦Inverse的博客-程序员宅基地

以uchome中实现定时计划任务为例:1. 把所有的计划任务存放到数据库2. 每次用户进行操作或打开页面的时候都按排序执行一条计划任务. 也就是轮番判断,时间到了的, 就在用户进程中执行.uchome的计划任务代码在 ./source/function_cron.phpignore_user_abort()php中实现定时计划任务的思路很多,但最适合Web的还是触发式的,就是类似于DZ和PHPWi...

群硕java开发笔试题_群硕笔试题_weixin_39756416的博客-程序员宅基地

群硕的笔试只有五个大题,两个编程题,比较简单,一个字符串方面的,一个是循环链表方面的,然后一个是智力题,一个是应用WEB方面的,这个当时不会做,最后一个就是英语阅读题,回答问题了。。。面试感觉也比较容 易,首先是英文自我介绍,然后英文问一两个问题,接下来转为技术中文面试,都问些简历上做的,只要做过一般都没问题。。。一概念1.过程化编程和面向对象编程的区别字串92.(a-1)xora==0和条件 字...

CodeFarmer RAD Tools(原型)_IBMinfo78的博客-程序员宅基地

C.F.(Code Farmer) RAD Tools(原型)是一个基于Excel和VBA快速生成Win32 C/C++ Gui代码的工具,它可以独立用于C/C++函数方式的编程,也可以配合将来的CFGui库使用。C/C++的函数编程方式灵活,但对于大型工程应用和高性能软件开发是首选。若要程序安全(不言而喻)、运行高效、不含第三方Lib库,则自己构建Gui(以上PDF文档链接:https://pan.baidu.com/s/11UvQf80b6Jn4ZG7nVDdHTg提取码:bpf6

Percona Toolkit之pt-table-checksum学习_weixin_30443747的博客-程序员宅基地

pt-table-checksum用来检测主从数据库上的数据一致性,其原理是通过在主库上运行一系列的MySQL函数计算每个表的散列值,并利用主从关系将相同的操作在从服务器上重放(基于statement格式的binlog),从而获取到主从服务器上的散列值然后比较散列值判定主从数据是否一致。对于表中的单行数据,先检查每一列的数据类型,然后将所有的数据类型转换为字符串,再使用concat_...

spark中的宽窄依赖_韩运畅的博客-程序员宅基地

NarrowDependency: Base class for dependencies where each partition of the child RDD depends on a small number of partitions of the parent RDD. Narrow dependencies allow for pipelined execution....

推荐文章

热门文章

相关标签