写在前面前端
本文章版权归博客园和做者共同全部,转载请注明原文地址博客园吴双 http://www.cnblogs.com/tdws/数组
闭包真的是学过一遍又一遍,Js博大精深,每次学习都感受有新的收获。相信在你们封装前端插件时,闭包是必不可少的。闭包的真正好处我我的认为除了封装仍是封装,能带个咱们私有方法,和调用上的灵活方便,也会使你的代码对外的对象保持干净整洁。闭包
维基百科这样定义了JS闭包:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即便已经离开了创造它的环境也不例外。因此,有另外一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时能够有多个实例,不一样的引用环境和相同的函数组合能够产生不一样的实例。app
通俗的讲,闭包不一样于通常函数,它容许一个函数在当即此法调用的做用域外,仍可访问非本地变量。我还想说,闭包的语法让你的代码更加动感,下面的一段代码可能会让你有所感触。函数
<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强大的智能提示,你会感受到无比的畅快。下面我又附加了一个方法this
(function () { var baseUrl = "www.cnblogs.com/tdws/"; application.getBaseUrl = function () { return baseUrl; } }()); console.log(application.getBaseUrl());//www.cnblogs.com/tdws/
你不以为把变量保留起来,暴露出一系列get方法,很动感吗 ╮(╯-╰)╭ 摊手......spa
固然闭包也须要你恰当的使用,不要形成循环引用,由于它将致使内存泄漏。不要作无谓的闭包,形成你空间的浪费,由于闭包不会被释放。不要到处闭包,由于它将增长你代码的复杂性。插件
若是你以为个人点滴分享,对你有点滴帮助,欢迎点击下方红色按钮关注,我将持续分享。也欢迎点下推荐,为我,也你本身点赞。code