深入浅出理解JavaScript闭包的功能与用法


Posted in Javascript onAugust 01, 2018

本文实例讲述了JavaScript闭包的功能与用法。分享给大家供大家参考,具体如下:

理解闭包关键是理解JS的对象的本质以及垃圾收集机制。函数也是对象,也有属性,通常执行一个函数时,局部变量在函数执行完后,内存会被回收,这是JS的垃圾收集机制决定的,如果想保存局部变量所占用的内存,就必须把保存在另一个不被回收的变量中,通常是全局变量。函数在创建时,内部属性[[Scope]]保存了作用域链,作用域链中包含外部函数以及全局对象的变量,被称为变量对象。所以把内部函数返回时,由于把函数保存了,所以内部属性[[Scope]]所保存的变量对象也就保存了而没有被回收,因此局部变量也就被保存了。

最简单的闭包:

function f1() {
 var i = 0;
 return function () {
 var j = 0;
 i++;
 console.log(i,j);
 };
}
var fn = f1();
fn();//1 0
fn();//2 0

还有诸如给元素添加事件,事件函数保存着外部函数的变量,通过这个特性可以让按钮显示被点击次数。

当然可以创建多层闭包,最内部函数保存所有外部函数以及全局对象的变量,但并不是任何地方都用闭包,因为其始终都带有[[Scope]]属性,所有比较占内存,所以在需要的时候才用。

闭包在模块化编程,为函数或对象创建私有变量的时候非常有用,可以避免全局污染以及变量命名冲突的问题。

值得注意的是因为[[Scope]]与函数有关,如上述例子,在两次执行f1函数把返回的函数保存在不同的变量中,其外部函数的变量是互不影响的。如:

function f1() {
 var i = 0;
 return function () {
 var j = 0;
 i++;
 console.log(i,j);
 };
}
var fn = f1();
fn();//1 0
fn();//2 0
var fn1 = f1();
fn1();//1 0
fn(); //3 0
fn1();//2 0

感兴趣的朋友可以使用在线HTML/CSS/JavaScript前端代码调试运行工具:http://tools.3water.com/code/WebCodeRun测试一下上述代码的运行效果,以加深对javascript闭包的认识。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript常用函数技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
JavaScript实现继承的4种方法总结
Oct 16 Javascript
javascript事件模型实例分析
Jan 30 Javascript
js实现简单选项卡与自动切换效果的方法
Apr 10 Javascript
js性能优化技巧
Nov 29 Javascript
学习JavaScript设计模式之迭代器模式
Jan 19 Javascript
jQuery插件dataTables添加序号列的方法
Jul 06 Javascript
理解javascript中的闭包
Jan 11 Javascript
使用Math.max,Math.min获取数组中的最值实例
Apr 25 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
微信小程序服务器日期格式化问题
Jan 07 Javascript
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 Javascript
Angular路由ui-router配置详解
Aug 01 #Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
Aug 01 #Javascript
JavaScript事件冒泡与事件捕获实例分析
Aug 01 #Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 #Javascript
create-react-app 修改为多入口编译的方法
Aug 01 #Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
Aug 01 #Javascript
JavaScript执行环境及作用域链实例分析
Aug 01 #Javascript
You might like
PHP面向对象概念
2011/11/06 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
js制作简易年历完整实例
2015/01/28 Javascript
Javascript变量的作用域和作用域链详解
2015/04/02 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
python之文件读取一行一行的方法
2018/07/12 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
numpy中的ndarray方法和属性详解
2019/05/27 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Noon埃及:埃及在线购物
2019/11/26 全球购物
皇城相府导游词
2015/02/06 职场文书
幼师个人总结范文
2015/02/28 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python