关于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 相关文章推荐
this[] 指的是什么内容 讨论
Mar 24 Javascript
模拟电子签章盖章效果的jQuery插件源码
Jun 24 Javascript
JS常见问题整理(持续更新)
Aug 06 Javascript
javascript 常用验证函数总结
Jun 28 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
Mar 03 Javascript
js仿网易表单及时验证功能
Mar 07 Javascript
基于jQuery.i18n实现web前端的国际化
May 04 jQuery
Element-ui tree组件自定义节点使用方法代码详解
Sep 17 Javascript
Electron中实现大文件上传和断点续传功能
Oct 28 Javascript
JavaScript Reflect Metadata实现详解
Dec 12 Javascript
Typescript3.9 常用新特性一览(推荐)
May 14 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 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初学者头疼问题总结
2006/10/09 PHP
php学习之 认清变量的作用范围
2010/01/26 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
Three.js基础学习教程
2017/11/16 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
HTML5中使用postMessage实现两个网页间传递数据
2016/06/22 HTML / CSS
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
文案策划求职信
2014/04/14 职场文书
优秀中职教师事迹材料
2014/08/26 职场文书
单位授权委托书范本
2014/09/26 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android