关于Javascript闭包与应用的详解


Posted in Javascript onApril 22, 2021

前言

Javascript闭包在学习过程中一般较难理解,本文从什么是闭包,常见闭包示例,闭包作用,闭包应用及闭包问题等方面来介绍闭包,希望能给大家带来更深层次的认识,有不恰当之处请指出,谢谢。

一、什么是闭包?

闭包是指一个嵌套的内部(子)函数引用了父函数作用域中数据的函数,这就产生了闭包。

关键理解:

1. 产生闭包必须要有嵌套函数
2. 闭包是函数,并是嵌套的内部函数
3. 闭包内部函数必须要引用父函数作用域中数据

如果不满足以上条件,则不能产生闭包,接下来示例说明。

1.1闭包满足条件代码

<script>
			function person(){
				var name='marshal';
				function student(){ //声明子函数
					console.log(name);//引用父函数作用域的变量name
				}
			}
			person();//函数执行,产生闭包
		</script>

关于Javascript闭包与应用的详解

1.2闭包产生时机

<script>
			function person(){
				var name='marshal';//js执行此行时,产生闭包
				function student(){ //声明子函数
					console.log(name);//引用父函数作用域的变量name
				}
				student();//内部函数在外部函数调用
			}
			person();//函数执行,虽满足闭包条件,但未产生闭包
		</script>

关于Javascript闭包与应用的详解

闭包产生时机:嵌套子函数代码块有引用父函数作用域的数据,并该嵌套子函数要执行前,创建上下文时产生闭包。或者简单说该该嵌套子函数在外部被执行时,此刻产生了闭包。

<script>
			function person(){
				var name='marshal';
				function student(){
					console.log(name);  //该方法代码内为闭包代码
				}
				return student;
			}
			var p=person();//因创建子函数对像,此时产生第一次闭包,并将子函数student返回给p,由于p没有消失,子函数引用的变量name,一直在内存在存储,直到将p=null,进行回收
			p();//执行子函数的闭包代码块,输出"marhsal"
			p();//第二次执行子函数的闭包代码块,输出"marhsal"
			person();//第二次创建子函数调对象,此时产生第二次闭包,但不执行子函数student代码块      
		</script>

二、常见闭包示例

2.1 子函数做为实参传递

<script>
			function setTimeoutTest(message,time){
				setTimeout(function(){
					alert(message);//嵌套子函数引用父函数变量message,产生闭包
				},time);
			}  
			setTimeoutTest('提示信息',1000);
		</script>

2.2 计数器使用(函数返回)

<script>
				function count(){
					var i=1;
					function add(){
						i++;
						console.log(i);
					}
					return add;
				}
				var c=count();//生产闭包
				c();//2
				c();//3
				c();//4
		</script>

三、闭包作用

3.1 闭包作用

1)子函数引用父函数的变量或函数,生命周期延长

2)其变量或函数一直存在,外部可以访问函数内部的值

<script>
			function count(){
				var i=1;
				function add(){
					i++;
					console.log(i);
				}
				return add;
			}
			var c=count();
			c();//2
			c();//3  i的生命周期延长
	</script>

四、闭包应用

4.1 自定义封装js代码

外部js代码  out.js  实现自加与自减
(function count(){
	var i=1;
	function add(){
		i++;
		console.log(i);
	}
	function subtract(){
		i--
		console.log(i);
	}
	window.count={
		add:add,
		subtract:subtract
	}
})();
引用 out.js代码
<script src=out.js></script>
		<script>
			count.add(); //2
			count.subtract();//1
			count.subtract();//0
		</script>

五、闭包问题

5.1 闭包与this

<script>
     var name="marshal"; //创建全局变量
	 var person={
		 name:"leo",
		 getName:function(){ //返回匿名函数
			 return function(){  //返回this.name
				return this.name;  //返回字符串
			 }
		 }
	 };
	 alert(person.getName()()); //输出marshal,内部函数不可能直接访问外部函数this
	 
</script>

解决方法

<script>
	     var name="marshal";
			 var person={
				 name:"leo",
				 getName:function(){
					 var that=this;//把this保存到闭包可以访问的另一个变量中
					 return function(){
						return that.name;
					 }
				 }
			 };
			 alert(person.getName()());//that 指向person,而不是window
	</script>

5.2 内存泄露

在使用闭包时,因变量一直存在,需要解除对象的引用,将对象设置为null, 从而确保其内存在适当时候可以被回收。

到此这篇关于关于Javascript闭包与应用的详解的文章就介绍到这了,更多相关js闭包与应用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
比较详细的关于javascript 解析json的代码
Dec 16 Javascript
JavaScript Event学习第九章 鼠标事件
Feb 08 Javascript
js整数字符串转换为金额类型数据(示例代码)
Dec 26 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
JS和函数式语言的三特性
Mar 05 Javascript
js实现鼠标划过给div加透明度的方法
May 25 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
Mar 25 Javascript
Node解决简单重复问题系列之Excel内容的获取
Jan 02 Javascript
Vue 父子组件的数据传递、修改和更新方法
Mar 01 Javascript
vue兄弟组件传递数据的实例
Sep 06 Javascript
JavaScript链式调用实例浅析
Dec 19 Javascript
vue首次渲染全过程
使用 JavaScript 制作页面效果
Apr 21 #Javascript
一道JS算法面试题——冒泡、选择排序
Apr 21 #Javascript
吃通javascript正则表达式
Apr 21 #Javascript
Ajax是什么?Ajax高级用法之Axios技术
在HTML5 localStorage中存储对象的示例代码
Apr 21 #Javascript
canvas多重阴影发光效果实现
You might like
php如何调用webservice应用介绍
2012/11/24 PHP
Yii核心组件AssetManager原理分析
2014/12/02 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
python距离测量的方法
2018/03/06 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
python import 上级目录的导入
2020/11/03 Python
浅谈react路由传参的几种方式
2021/03/23 Javascript
公司年会晚宴演讲稿
2014/01/06 职场文书
科研先进个人典型材料
2014/01/31 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
小学开学标语
2014/07/01 职场文书
校园运动会广播稿
2014/10/06 职场文书
2015年基层党组织公开承诺书
2015/01/21 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
百年校庆感言
2015/08/01 职场文书
浅谈redis整数集为什么不能降级
2021/07/25 Redis