深入浅出理解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 仿关机效果的图片层
Dec 26 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
Jul 14 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
jquery弹出层类代码分享
Dec 27 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
Jun 30 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
Jan 30 Javascript
js实现获取当前时间是本月第几周的方法
Aug 11 Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 Javascript
JavaScript模块详解
Dec 18 Javascript
ionic3双击返回退出应用的方法
Sep 17 Javascript
vue学习之Vue-Router用法实例分析
Jan 06 Javascript
vue+element 实现商城主题开发的示例代码
Mar 26 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
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
判断横屏竖屏(三种)
2017/02/13 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
老生常谈javascript的面向对象思想
2017/08/22 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
Python模拟登录12306的方法
2014/12/30 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python如何给函数库增加日志功能
2020/08/04 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
办公室文秘岗位职责
2013/11/15 职场文书
会务接待方案
2014/02/27 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis