深入浅出理解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 函数对象的多重身份
Jun 28 Javascript
JS获取后台Cookies值的小例子
Mar 04 Javascript
js 金额格式化来回转换示例
Feb 23 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
Mar 04 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
深入理解$.each和$(selector).each
May 15 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 Javascript
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
Aug 10 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中几种常见安全设置详解
2010/04/06 PHP
php实现建立多层级目录的方法
2014/07/19 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
JavaScript动态创建link标签到head里的方法
2014/12/22 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
javascript性能优化之事件委托实例详解
2015/12/12 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
JS实现li标签的删除
2019/04/12 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
python图像处理之反色实现方法
2015/05/30 Python
详解Swift中属性的声明与作用
2016/06/30 Python
python 将md5转为16字节的方法
2018/05/29 Python
Python中print和return的作用及区别解析
2019/05/05 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
什么是.net
2015/08/03 面试题
高中生毕业学习总结的自我评价
2013/11/14 职场文书
优秀教师先进事迹
2014/01/22 职场文书
运动会广播稿400字
2014/01/25 职场文书
学术诚信承诺书
2014/05/26 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2014年移动公司工作总结
2014/12/08 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
在项目中使用redis做缓存的一些思路
2021/09/14 Redis