关于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自带函数备忘 数组
Dec 29 Javascript
json简单介绍
Jun 10 Javascript
为javascript添加String.Format方法
Aug 11 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
js实现select组件的选择输入过滤代码
Oct 14 Javascript
ECharts仪表盘实例代码(附源码下载)
Feb 18 Javascript
jQuery EasyUI菜单与按钮详解
Jul 13 Javascript
vue 使用ref 让父组件调用子组件的方法
Feb 08 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
Aug 29 Javascript
Vue程序化的事件监听器(实例方案详解)
Jan 07 Javascript
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 jQuery
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-fpm的两种进程管理模式详解
2013/06/03 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP和MySql中32位和64位的整形范围是多少
2016/02/18 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
基于jquery跨浏览器显示的file上传控件
2011/10/24 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
python实现微信自动回复功能
2018/04/11 Python
python 日志增量抓取实现方法
2018/04/28 Python
Python实现字典(dict)的迭代操作示例
2018/06/05 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
药学专业个人自我评价
2013/11/11 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
红头文件任命书范本
2014/06/05 职场文书
工地宣传标语
2014/06/18 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
2014年网络管理员工作总结
2014/12/01 职场文书
节约用电通知
2015/04/25 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书