如何掌握Javascript闭包及其应用,有哪些要点
Admin 2022-10-21 群英技术资讯 970 次浏览
这篇文章主要介绍了“如何掌握Javascript闭包及其应用,有哪些要点”相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何掌握Javascript闭包及其应用,有哪些要点文章都会有所收获,下面我们一起来看看吧。
闭包是指一个嵌套的内部(子)函数引用了父函数作用域中数据的函数,这就产生了闭包。
关键理解:
1. 产生闭包必须要有嵌套函数
2. 闭包是函数,并是嵌套的内部函数
3. 闭包内部函数必须要引用父函数作用域中数据
如果不满足以上条件,则不能产生闭包,接下来示例说明。
| 1 2 3 4 5 6 7 8 9 | <script> function person(){ var name= 'marshal' ; function student(){ //声明子函数 console.log(name); //引用父函数作用域的变量name } } person(); //函数执行,产生闭包 </script> |

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

闭包产生时机:嵌套子函数代码块有引用父函数作用域的数据,并该嵌套子函数要执行前,创建上下文时产生闭包。或者简单说该该嵌套子函数在外部被执行时,此刻产生了闭包。
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <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> |
| 1 2 3 4 5 6 7 8 | <script> function setTimeoutTest(message,time){ setTimeout( function (){ alert(message); //嵌套子函数引用父函数变量message,产生闭包 },time); } setTimeoutTest( '提示信息' ,1000); </script> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < script > function count(){ var i=1; function add(){ i++; console.log(i); } return add; } var c=count();//生产闭包 c();//2 c();//3 c();//4 </ script > |
1)子函数引用父函数的变量或函数,生命周期延长
2)其变量或函数一直存在,外部可以访问函数内部的值
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <script> function count(){ var i=1; function add(){ i++; console.log(i); } return add; } var c=count(); c(); //2 c(); //3 i的生命周期延长 </script> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 外部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 } })(); |
| 1 2 3 4 5 6 7 | 引用 out.js代码 <script src=out.js></script> <script> count.add(); //2 count.subtract(); //1 count.subtract(); //0 </script> |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <script> var name= "marshal" ; //创建全局变量 var person={ name: "leo" , getName: function (){ //返回匿名函数 return function (){ //返回this.name return this .name; //返回字符串 } } }; alert(person.getName()()); //输出marshal,内部函数不可能直接访问外部函数this </script> |
解决方法
?| 1 2 3 4 5 6 7 8 9 10 11 12 13 | <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> |
在使用闭包时,因变量一直存在,需要解除对象的引用,将对象设置为null, 从而确保其内存在适当时候可以被回收。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
vue跟小程序的区别:1、vue一般会在created或者mounted中请求数据,而在小程序会在onLoad或onShow中请求数据;2、vue动态绑定一个变量的值为元素的某个属性的时候,会在变量前面加上冒号,而小程序绑定某个变量的值为元素属性时,会用两个大括号括起来;3、vue用“v-if”和“v-show”控制元素的显示和隐藏,小程序用“wx-if”和hidden控制。
这篇文章主要给大家介绍了关于vue动态菜单、动态路由加载以及刷新踩坑的相关资料,踩的这些坑其实是挺常见的,大家可以看看,避免遇到的时候再踩到同样的坑,需要的朋友可以参考下
这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章给大家分享的是怎样使用vue做一个价格日历效果的代码。在日历上能一目了然的看到每人的费用价格记录是多少,小编觉得挺有趣的,因此分享给大家做个参考,感兴趣的朋友就接着看吧。
这篇文章给大家分享的是有关Js实现画廊效果的内容,小编觉得挺实用的,可以用来做图片展示,下文有两种实现效果及代码,感兴趣的朋友可以做个参考,接下来一起跟随小编看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008