深入浅出理解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 相关文章推荐
form表单中去掉默认的enter键提交并绑定js方法实现代码
Apr 01 Javascript
Bootstrap进度条组件知识详解
May 01 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
Sep 17 Javascript
Angular页面间切换及传值的4种方法
Nov 04 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
jQuery+Ajax实现用户名重名实时检测
Jun 01 jQuery
JS实现移动端判断上拉和下滑功能
Aug 07 Javascript
iframe与主框架跨域相互访问实现方法
Sep 14 Javascript
JS中常用的消息框总结
Feb 24 Javascript
vue2.0 实现富文本编辑器功能
May 26 Javascript
react组件基本用法示例小结
Apr 27 Javascript
微信小程序用户盒子、宫格列表的实现
Jul 01 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读取目录下所有文件的代码
2008/01/07 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
php支付宝在线支付接口开发教程
2016/09/19 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
JavaScript中的字符串操作详解
2013/11/12 Javascript
js文件Cookie存取值示例代码
2014/02/20 Javascript
JS获取客户端IP地址、MAC和主机名的7个方法汇总
2014/07/21 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
javascript中Date对象应用之简易日历实现
2016/07/12 Javascript
走进AngularJs之过滤器(filter)详解
2017/02/17 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
JS原型和原型链原理与用法实例详解
2020/02/05 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
浅谈python对象数据的读写权限
2016/09/12 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python通过链接抓取网站详解
2019/11/20 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
任命书怎么写
2014/06/04 职场文书
会议接待欢迎标语
2014/10/08 职场文书
高二数学教学反思
2016/02/18 职场文书
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS