关于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 相关文章推荐
两个DIV等高的JS的实现代码
Dec 23 Javascript
jQuery插件开发全解析
Oct 10 Javascript
带左右箭头图片轮播的JS代码
Dec 18 Javascript
js简单的弹出框有关闭按钮
May 05 Javascript
js实现按钮加背景图片常用方法
Nov 01 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
基于JS实现带动画效果的流程进度条
Jun 01 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
vue 获取及修改store.js里的公共变量实例
Nov 06 Javascript
JS实现小星星特效
Dec 24 Javascript
vue 授权获取微信openId操作
Nov 13 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中如何定义和使用常量
2013/02/28 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
php mysql 封装类实例代码
2016/09/18 PHP
php的扩展写法总结
2019/05/14 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
js实现缓动动画
2020/11/25 Javascript
Python读取Excel的方法实例分析
2015/07/11 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
python str字符串转uuid实例
2020/03/03 Python
美国美妆网站:B-Glowing
2016/10/12 全球购物
德国鞋子网上商店:Omoda.de
2017/03/31 全球购物
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
SmartBuyGlasses美国官网:太阳眼镜和眼镜
2017/08/20 全球购物
小学教师的个人自我鉴定
2013/10/26 职场文书
门卫岗位安全职责
2013/12/13 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
2014年维稳工作总结
2014/11/18 职场文书
授权委托书
2015/01/28 职场文书
社会实践活动报告
2015/02/05 职场文书
捐书活动倡议书
2015/04/27 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle