深入浅出理解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 相关文章推荐
IE8 下的Js错误HTML Parsing Error...
Aug 14 Javascript
jquery代码实现多选、不同分享功能
Jul 31 Javascript
jQuery实现的网格线绘制方法
Jun 20 Javascript
JavaScript中的对象继承关系
Aug 01 Javascript
Vue.JS入门教程之自定义指令
Dec 08 Javascript
jQuery实现级联下拉框实战(5)
Feb 08 Javascript
JS实现登录页密码的显示和隐藏功能
Dec 06 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
May 10 Javascript
vue组件实现可搜索下拉框扩展
Oct 23 Javascript
微信小程序自定义组件之可清除的input组件
Jul 17 Javascript
详解Vue.js中引入图片路径的几种方式
Jun 17 Javascript
JS+CSS实现炫酷光感效果
Sep 05 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
星际争霸任务指南——神族
2020/03/04 星际争霸
WordPress中获取页面链接和标题的相关PHP函数用法解析
2015/12/17 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
自动更新作用
2006/10/08 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
jQuery客户端分页实例代码
2013/11/18 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
微信小程序实现弹框效果
2020/05/26 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
利用Celery实现Django博客PV统计功能详解
2017/05/08 Python
python合并同类型excel表格的方法
2018/04/01 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
postman和python mock测试过程图解
2020/02/22 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
关于工资低的辞职信
2014/01/14 职场文书
广告词串烧
2014/03/19 职场文书
购房意向书
2014/04/01 职场文书
紧急迫降观后感
2015/06/15 职场文书