深入浅出理解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 相关文章推荐
javascript下查找父节点的简单方法
Aug 13 Javascript
用js实现的自定义的对话框的实现代码
Mar 21 Javascript
多种方式实现JS调用后台方法进行数据交互
Aug 20 Javascript
JavaScript 基本概念
Jan 20 Javascript
jquery实现对联广告的方法
Feb 05 Javascript
jquery实现简单合拢与展开网页面板的方法
Sep 01 Javascript
原生js实现数字字母混合验证码的简单实例
Dec 10 Javascript
用window.onerror捕获并上报Js错误的方法
Jan 27 Javascript
基于JavaScript实现智能右键菜单
Mar 02 Javascript
TypeScript学习之强制类型的转换
Dec 27 Javascript
js实现拖拽功能
Mar 01 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
Sep 11 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
Yii框架中memcache用法实例
2014/12/03 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
utf8的编码算法 转载
2006/12/27 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
探究react-native 源码的图片缓存问题
2017/08/24 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python 排序算法总结及实例详解
2016/09/28 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
python、java等哪一门编程语言适合人工智能?
2017/11/13 Python
详解Python如何生成词云的方法
2018/06/01 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
tensorflow 环境变量设置方式
2020/02/06 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
基于python实现计算两组数据P值
2020/07/10 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
行政办公员自我评价分享
2013/12/14 职场文书
小学毕业感言50字
2014/02/16 职场文书
给全校老师的建议书
2014/03/13 职场文书
小学生家长意见
2015/06/03 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
nginx优化的六点方法
2021/03/31 Servers