深入浅出理解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 相关文章推荐
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
Feb 05 Javascript
jquery、js操作checkbox全选反选
Mar 12 Javascript
JavaScript的各种常见函数定义方法
Sep 16 Javascript
ECMAScript6中Set/WeakSet详解
Jun 12 Javascript
浅谈javascript中return语句
Jul 15 Javascript
jquery实现手风琴效果
Nov 20 Javascript
JQuery EasyUI的使用
Feb 24 Javascript
微信小程序 switch组件详解及简单实例
Jan 10 Javascript
Node.js 的模块知识汇总
Aug 16 Javascript
VUE引入第三方js包及调用方法讲解
Mar 01 Javascript
原生js实现下拉选项卡
Nov 27 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
Jan 05 Vue.js
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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
使用PHP静态变量当缓存的方法
2013/11/13 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
JS实现字体选色板实例代码
2013/11/20 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
JS跨域问题详解
2014/11/25 Javascript
JS通过ajax动态读取xml文件内容的方法
2015/03/24 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
面试常见的js算法题
2017/03/23 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
Python文件读写常见用法总结
2019/02/22 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
python pyinstaller打包exe报错的解决方法
2019/11/02 Python
Pytorch释放显存占用方式
2020/01/13 Python
python代码区分大小写吗
2020/06/17 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
J2EE面试题集锦(附答案)
2013/08/16 面试题
班组长岗位职责
2014/03/03 职场文书
考研导师推荐信范文
2015/03/27 职场文书
计算机实训心得体会
2016/01/14 职场文书
服务器nginx权限被拒绝解决案例
2022/09/23 Servers