再谈JavaScript闭包及应用

写在前面

本文章版权归博客园和作者共同所有,转载请注明原文地址博客园吴双 http://www.cnblogs.com/tdws/

闭包真的是学过一遍又一遍,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/

写在最后

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

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

如果你觉得我的点滴分享,对你有点滴帮助,欢迎点击下方红色按钮关注,我将持续分享。也欢迎点下推荐,为我,也你自己点赞。

时间: 2024-08-07 08:03:36

再谈JavaScript闭包及应用的相关文章

再谈javascript图片预加载技术

图片预加载技术的典型应用: 如lightbox方式展现照片,无疑需要提前获得大图的尺寸,这样才能居中定位,由于javascript无法获取img文件头数据,必须等待其加载完毕后才能获取真实的大小然后展示出来,所以lightbox显示的图片的速度体验要比直接输出的差很多,而本文说提到的预加载技术主要针对获取图片尺寸. 一段典型的使用预加载获取图片大小的例子: var imgLoad = function (url, callback) {    var img = new Image();   

再谈JavaScript的closure--JavaScript 闭包

关于JavaScript的闭包,在我的博客上之前有一篇文章 https://www.cnblogs.com/wphl-27/p/8491327.html 今天看了几篇文章,感觉又有了一些更深的理解,特记录如下: 其实关于JavaScript的闭包closure, 简单点理解可以如下: 在JavaScript中,一个函数A内部又包含一个函数B, 同时把内部函数B作为函数A的返回值,这个时候,就形成了一个闭包. 我们来看一个简单的例子: var a = 5; function TestAdd(){

再谈javascript面向对象编程

前言:虽有陈皓<Javascript 面向对象编程>珠玉在前,但是我还是忍不住再画蛇添足的补上一篇文章,主要是因为javascript这门语言魅力.另外这篇文章是一篇入门文章,我也是才开始学习Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正 吐槽Javascript 初次接触Javascript,这门语言的确会让很多正规军感到诸多的不适,这种不适来自于Javascript的语法的简练和不严谨,这种不适也 来自Javascript这个悲催的名称,

浅谈JavaScript闭包、this指针、作用域(一)

认识闭包: 闭包,是指有权限访问到其他函数作用域的变量的函数 给一个例子: function outer () { var name = 'HelloTF'; return function () { console.log (name); } } var getName = outer(); getName(); //HelloTF 函数outer执行后返回一个内部的匿名函数,并把返回的结果赋值给全局变量result,在全局环境中在此执行result,得到了outer函数内部的变量name.

浅谈JavaScript闭包

一.背景知识 在介绍闭包之前,我觉得有必要先简单的介绍一些背景知识,如变量的作用域.嵌套函数.垃圾回收机制等概念. 1.作用域 作用域是程序运行时变量可被访问的范围,定义在函数内的的变量是局部变量,局部变量的作用域只能是函数内部范围内,它不能在函数外引用.定义在模块最外层的的变量是全局变量,它是全局范围内可见的,当然在函数里面也可以读取到全局变量的. var a = 123; //全局变量 function fun(){ var b = 456; //局部变量 } 2.嵌套函数 函数不仅可以定义

再谈JavaScript中的闭包

一.什么是闭包 闭包就是有权访问另一个函数作用域中变量的函数,因此,闭包的本质是一个函数.当一个内部函数被保存到外部时,就会生成闭包. 二.闭包的作用 1.实现公有变量,即通过局部变量实现全局变量的效果 案例:定义一个函数,每调用 一次数字累加一次,即计数器效果 //非闭包实现 var num = 0; function count() { console.log(++num); } count(); // 1 count(); // 2 count(); // 3 //闭包实现 functio

移花接木—— 再谈javascript中的 call 与 apply

在JavaScript中,call 和 apply 是Function对象自带的两个方法,这两个方法的主要作用是改变函数中的this指向,从而可以达到`接花移木`的效果.本文将对这两个方法进行详细的讲解,并列出几个关于call和apply的经典应用场景. call(thisArgs [,args...]) 该方法可以传递一个thisArgs参数和一个参数列表,thisArgs指定了函数在运行期的调用者,也就是函数中的this对象,而参数列表会被传入调用函数中.thisArgs的取值有以下4种情况

再谈javascript函数节流

之前写过但是不记得在哪了,今天同事要一个滑到页面底部加载更多内容的效果,又想起了这玩意儿,确实挺实用和常用的,谨此记之. 函数节流从字面上的意思就是节约函数的执行次数,其实现的主要思想是通过定时器阻断函数的连续执行,尤其适合用在频繁操作,比如window的resize和scroll事件等. window的默认scroll事件间隔时间大概只有十几毫秒,如果频繁的scroll,然后去请求,然后渲染,对性能肯定有很大的影响. 大概模式: var processor = { timer: null, p

我也谈javascript闭包

1.什么是闭包呢?Whenever you see the function keyword within another function, the inner function has access to variables in the outer function function foo(x) { var tmp = 3; return function (y) { alert(x + y + (++tmp)); // will also alert 16 } } var bar =