详谈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 相关文章推荐
js 分栏效果实现代码
Aug 29 Javascript
ExtJs中简单的登录界面制作方法
Aug 19 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
js中一维数组和二位数组中的几个问题示例说明
Jul 17 Javascript
angularjs的一些优化小技巧
Dec 06 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
Aug 11 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
Mar 24 Javascript
原生js仿jquery一些常用方法(必看篇)
Sep 20 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
vue-froala-wysiwyg 富文本编辑器功能
Sep 19 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实现图片局部打马赛克的方法
2015/02/11 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
JavaScript控制Session操作方法
2013/01/17 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
Angular路由简单学习
2016/12/26 Javascript
javascript简单写的判断电话号码实例
2017/05/24 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
webpack实用小功能介绍
2018/01/02 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
离线安装Pyecharts的步骤以及依赖包流程
2020/04/23 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
用友笔试题目
2016/10/25 面试题
蔬菜基地的创业计划书
2014/01/06 职场文书
个人实习生的自我评价
2014/02/16 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
springboot入门 之profile设置方式
2022/04/04 Java/Android