详谈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 相关文章推荐
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
JavaScript截取字符串的Slice、Substring、Substr函数详解和比较
Mar 20 Javascript
jQuery聚合函数实例
May 21 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
jquery移动端TAB触屏切换实现效果
Dec 22 Javascript
原生js实现jquery函数animate()动画效果的简单实例
Aug 21 Javascript
JavaScript学习笔记整理_setTimeout的应用
Sep 19 Javascript
vue2.0 常用的 UI 库实例讲解
Dec 12 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
js设置鼠标悬停改变背景色实现详解
Jun 26 Javascript
Vue实现push数组并删除的例子
Nov 01 Javascript
JavaScript实现轮播图片完整代码
Mar 07 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
Uncaught exception com_exception with message Failed to create COM object
2012/01/11 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
简单理解vue中实例属性vm.$els
2016/12/01 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
python操作oracle的完整教程分享
2018/01/30 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
Tensorflow中使用tfrecord方式读取数据的方法
2018/06/19 Python
解决Django一个表单对应多个按钮的问题
2019/07/18 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
Django异步任务线程池实现原理
2019/12/17 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
外企财务年会演讲稿
2014/01/03 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
小学数学课后反思
2014/04/23 职场文书
企业人事任命书
2014/06/05 职场文书
应届生面试求职信
2014/07/02 职场文书
电影复兴之路观后感
2015/06/02 职场文书
公开致歉信
2019/06/24 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python