详谈JavaScript的闭包及应用


Posted in Javascript onJanuary 17, 2017

闭包真的是学过一遍又一遍,Js博大精深,每次学习都感觉有新的收获。相信在大家封装前端插件时,闭包是必不可少的。闭包的真正好处我个人认为除了封装还是封装,能带个我们私有方法,和调用上的灵活方便,也会使你的代码对外的对象保持干净整洁。

进入正题

维基百科这样定义了JS闭包:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。

通俗的讲,闭包不同于一般函数,它允许一个函数在立即此法调用的作用域外,仍可访问非本地变量。我还想说,闭包的语法让你的代码更加动感,下面的一段代码可能会让你有所感触。

<script>
 (function () {
 var userToken = "this is my token";
 var someConfig = "opening some function";
 var privateValue = "private";
 var publicValue = "public";
 var appObj = {};
 function myPrivateFunc() {
 alert(privateValue)
 }
 appObj.getUserToken = function () {
 //some logic
 userToken += " after some inner logic";
 return userToken;
 }
 appObj.publicVal = publicValue;
 window.application = appObj;
 }());//立即执行
 console.log(application.getUserToken());//this is my token after some inner logic
 console.log(application.publicVal);//public
 console.log(application.privateValue); //undefined
 application.myPrivateFunc(); //error
 </script>

我将appObj附加到window下面,我通常喜欢定义一个全局的名为application的对象,代表着整个应用公用的顶级对象,你可以在其中向外暴露很多公共的操作方法,也可以在其中做一些私有的处理,以防外部调用导致某些问题。在所定义的“顶级”application对象下,你也可以将你所非要不可的全局变量定义在其中,这样以防普通全局变量对应用造成的影响,又可以在你定义的闭包内,通过向外暴露的对象表达更明确的信息,我一直认为,随随便便定义一个JS全局变量实在是太可耻了。

闭包的写法加上VS强大的智能提示,你会感觉到无比的畅快。下面我又附加了一个方法

(function () {
 var baseUrl = "www.cnblogs.com/tdws/";

 application.getBaseUrl = function () {
 return baseUrl;
 }
 }());
 console.log(application.getBaseUrl());//www.cnblogs.com/tdws/

详谈JavaScript的闭包及应用

写在最后

你不觉得把变量保留起来,暴露出一系列get方法,很动感吗 ?(?-?)? 摊手......

当然闭包也需要你恰当的使用,不要造成循环引用,因为它将导致内存泄漏。不要做无谓的闭包,造成你空间的浪费,因为闭包不会被释放。不要处处闭包,因为它将增加你代码的复杂性。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
创建一个复制UBB软件信息的链接或按钮的js代码
Jan 06 Javascript
JavaScript表单常用验证集合
Jan 16 Javascript
javascript Base类 包含基本的方法
Jul 22 Javascript
jsTree 基于JQuery的排序节点 Bug
Jul 26 Javascript
JSON辅助格式化处理方法
Mar 26 Javascript
JS远程获取网页源代码实例
Sep 05 Javascript
原生javascript实现无间缝滚动示例
Jan 28 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
Mar 04 Javascript
七夕情人节丘比特射箭小游戏
Aug 20 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
May 16 Javascript
基于JavaScript FileReader上传图片显示本地链接
May 27 Javascript
js实现html滑动图片拼图验证
Jun 24 Javascript
用原生js做单页应用
Jan 17 #Javascript
js cookie实现记住密码功能
Jan 17 #Javascript
angularjs ocLazyLoad分步加载js文件实例
Jan 17 #Javascript
微信小程序 登陆流程详细介绍
Jan 17 #Javascript
jQuery无刷新上传之uploadify简单代码
Jan 17 #Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
Jan 17 #Javascript
js处理层级数据结构的方法小结
Jan 17 #Javascript
You might like
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jQuery常用数据处理方法小结
2015/02/20 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
jquery easyui如何实现格式化列
2017/07/30 jQuery
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
2020/11/12 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
中西医结合临床医学专业大学生自荐信
2013/09/28 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
幼儿园教师求职信
2015/03/20 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL