深入浅出理解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 相关文章推荐
JQuery优缺点分析说明
Jun 09 Javascript
JS正则中的RegExp对象对象
Nov 07 Javascript
js继承call()和apply()方法总结
Dec 08 Javascript
jquery实现全屏滚动
Dec 28 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
对Angular.js Controller如何进行单元测试
Oct 25 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
Dec 28 Javascript
javascript中this用法实例详解
Apr 06 Javascript
webpack 4.0.0-beta.0版本新特性介绍
Feb 10 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
Apr 02 Javascript
微信小程序 WXML节点信息查询详解
Jul 29 Javascript
Vue实现简易计算器
Feb 25 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
制作美丽的拉花
2021/03/03 冲泡冲煮
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
Vuex之理解state的用法实例
2017/04/19 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
简单的Python的curses库使用教程
2015/04/11 Python
python通过smpt发送邮件的方法
2015/04/30 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
python 检查文件mime类型的方法
2018/12/08 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
Python爬虫获取豆瓣电影并写入excel
2020/07/31 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
C# Debug和Testing相关面试题
2015/10/25 面试题
vue项目实现分页效果
2021/03/24 Vue.js
应届生幼儿园求职信
2013/11/12 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
党建工作经验交流材料
2014/05/25 职场文书
信息管理专业自荐书
2014/06/05 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
毕业晚宴祝酒词
2015/08/11 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android