关于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 相关文章推荐
js下用eval生成JSON对象
Sep 17 Javascript
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
js原型链原理看图说明
Jul 07 Javascript
查询json的数据结构的8种方式简介
Mar 10 Javascript
jQuery中is()方法用法实例
Jan 06 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
Jun 18 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
Jun 02 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
Jul 08 jQuery
node文字生成图片的示例代码
Oct 26 Javascript
vue使用laydate时间插件的方法
Nov 14 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 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 图像尺寸调整代码
2010/05/26 PHP
PHP导入导出Excel代码
2015/07/07 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
composer.lock文件的作用
2016/02/03 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JavaScript 异步调用框架 (Part 2 - 用例设计)
2009/08/03 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
关于Angularjs中跨域设置白名单问题
2018/04/17 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
爱我中华演讲稿
2014/05/20 职场文书
小人国观后感
2015/06/11 职场文书
新党员入党决心书
2015/09/22 职场文书
交通安全学习心得体会
2016/01/18 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书