深入浅出理解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 加上最后自己的验证
Nov 04 Javascript
JS倒计时代码汇总
Nov 25 Javascript
Javascript基础教程之JavaScript语法
Jan 18 Javascript
Javascript中With语句用法实例
May 14 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
JS实现自动阅读单词(有道单词本添加功能)
Nov 14 Javascript
Swiper实现轮播图效果
Jul 03 Javascript
Angular2 组件间通过@Input @Output通讯示例
Aug 24 Javascript
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
vue里面父组件修改子组件样式的方法
Feb 03 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
May 14 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
Nov 18 jQuery
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
解析CodeIgniter自定义配置文件
2013/06/18 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
php实现的http请求封装示例
2016/11/08 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
js获取当前页面的url网址信息
2014/06/12 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
使用jQuery操作HTML的table表格的实例解析
2016/03/13 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
react脚手架如何配置less和ant按需加载的方法步骤
2018/11/28 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
js实现坦克大战游戏
2020/02/24 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
python怎么自定义捕获错误
2020/06/29 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
护士自我鉴定
2013/10/23 职场文书
水污染治理专业毕业生推荐信
2013/11/14 职场文书
新闻传播专业求职信
2014/07/22 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
汽车转让协议书范本
2014/12/07 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers