详谈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 相关文章推荐
关于Javascript 的 prototype问题。
Jan 03 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
Dec 25 Javascript
深入理解js函数的作用域与this指向
May 28 Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 Javascript
JS正则匹配中文的方法示例
Jan 06 Javascript
JavaScript组件开发之输入框加候选框
Mar 10 Javascript
ES6扩展运算符用法实例分析
Oct 31 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 jQuery
微信小程序实现左右联动的实战记录
Jul 05 Javascript
小程序页面动态配置实现方法
Feb 05 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
May 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
谏山创故乡大分县日田市水坝将设立《进击的巨人》立艾伦、三笠以及阿尔敏的铜像!
2020/03/06 日漫
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
PHP 身份证号验证函数
2009/05/07 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
2015/12/18 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
php实现记事本案例
2020/10/20 PHP
ExpressJS入门实例
2015/01/14 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
React Native之ListView实现九宫格效果的示例
2017/08/02 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
python创建列表并给列表赋初始值的方法
2015/07/28 Python
Python制作Windows系统服务
2017/03/25 Python
python Pygame的具体使用讲解
2017/11/03 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
python+splinter自动刷新抢票功能
2018/09/25 Python
Python小白必备的8个最常用的内置函数(推荐)
2019/04/03 Python
python实现弹跳小球
2019/05/13 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
Python获取指定网段正在使用的IP
2020/12/14 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
面向中国市场的在线海淘美妆零售网站:Beauty House美丽屋
2021/03/02 全球购物
科级干部考察材料
2014/02/15 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
农村改厕实施方案
2014/03/22 职场文书
租房协议书
2014/09/12 职场文书
2015年度女工工作总结
2015/10/22 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书