javascript 闭包详解

 更新时间:2015年02月15日 09:55:37   投稿:hebedich  
这篇文章主要详细介绍了javascript 闭包的相关资料,十分详尽,需要的朋友可以参考下

javascript 闭包是一个很有趣的东东。看了些相关资料https://www.jb51.net/article/29472.htm,对其印象最深刻的是:实现了public 和private。

创建一个非匿名闭包最简单的语法是:

复制代码 代码如下:

var obj = (function(){//各种代码  });

闭包最经典的例子:

复制代码 代码如下:

var makeCounter = (function () {
        var i = 1;
        this.test=function(){
            console.log(i);
            i++;
        }
        return this;
    });
    var obj = makeCounter();
    obj.test(); // 1
    obj.test(); // 2
    var obj1 = makeCounter();
    obj1.test(); // 1
    obj1.test(); // 2

private 与 public :

复制代码 代码如下:

var makeCounter= (function () {
        var i = 1;
        //这货是private的
        function log(){
            console.log(i);
            i++;
        }
        //这货是public的
        this.test(){
            log();
        }
        return this;
    });
    var obj = makeCounter();
    obj.test(); // 1
    obj.test(); // 2
    obj.log(); //undefined   

自执行函数:

  第一次看到这样的代码时的感觉是:好高级;

复制代码 代码如下:

var obj = (function(window){
      //各种代码
}(window));

  然后google了下,发现他们经常都会这样写:

复制代码 代码如下:

var obj= (function () {
        var i = 1;
        this.test=function(){
            console.log(i);
            i++;
        }
        return this;
    }());
    obj.test(); // 1
    obj.test(); // 2

     最简单的理解,程序员偷懒把两步写成了一步。

复制代码 代码如下:

    //这是一个函数。它应该这样用obj()
    var makeCounter = function () {
        //各种代码
    }
    //这是一个对象。它类似于 var obj = makeCounter();
    var obj = (function () {
        //各种代码
    }());

  它也可以有参数:

复制代码 代码如下:

    var output = "new test";
    var obj = (function (msg) {
        this.test = function(){
            console.log(msg);
        }
        return this;
    }(output));
    obj.test();

  它还可以更复杂更高级点:

复制代码 代码如下:

var output = "new test";
    var obj = (function (obj, msg) {
        //这货也是私有的。类似obj.i(!=obj.i),却又不是obj.i(因为外部不可访问)。
        var i = 1;
        //private
        function log() {
            console.log(i + " : " + msg);
            i++;
        }
        //public
        obj.test = function () {
            log();
        }
        return obj;
    }(obj, output));
    obj.test(); // 1 : new test
    obj.i = 100;
    //i没被改变
    obj.test(); // 2 : new test

初次见面,留下了很深刻的印象。闭包的使用,实现了状态,属性的保持;避免了全局变量满屏飞舞;结束了变量老是被重定义,重赋值的尴尬局面。它还可以将一个对象分部到多个js文件。实在是太好了。

上面所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • JS实现网页滚动条感应鼠标变色的方法

    JS实现网页滚动条感应鼠标变色的方法

    这篇文章主要介绍了JS实现网页滚动条感应鼠标变色的方法,实例分析了javascript针对鼠标事件的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • JavaScript 九种跨域方式实现原理

    JavaScript 九种跨域方式实现原理

    这篇文章主要介绍了JavaScript 九种跨域方式实现原理,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • 基于JavaScript实现验证码功能

    基于JavaScript实现验证码功能

    这篇文章主要介绍了基于JavaScript实现验证码功能的相关资料
    2017-04-04
  • JavaScript获得当前网页来源页面(即上一页)的方法

    JavaScript获得当前网页来源页面(即上一页)的方法

    这篇文章主要介绍了JavaScript获得当前网页来源页面(即上一页)的方法,涉及javascript中document.referrer方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • 详解JS中的this、apply、call、bind(经典面试题)

    详解JS中的this、apply、call、bind(经典面试题)

    JS中的this、apply、call、bind是一道经典面试题,最好还是了解一下 this 的指向和 call、apply、bind 三者的区别。下面就跟随脚本之家小编一起学习this、apply、call、bind的知识吧
    2017-09-09
  • 利用js编写响应式侧边栏

    利用js编写响应式侧边栏

    这篇文章主要为大家详细介绍了利用js编写响应式侧边栏的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • javascript 另一种图片滚动切换效果思路

    javascript 另一种图片滚动切换效果思路

    把图片们用ul之类的包起来,并设置float。然后设置这个ul本身为absolute定位,其父标签用relative定位。通过设置ul的left或top值,实现图片队列的滚动效果
    2012-04-04
  • js学习阶段总结(必看篇)

    js学习阶段总结(必看篇)

    下面小编就为大家带来一篇js学习阶段总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • JavaScript 事件入门知识

    JavaScript 事件入门知识

    这篇文章主要介绍了JavaScript 事件入门知识,需要的朋友可以参考下
    2015-04-04
  • JavaScript 事件属性绑定带参数的函数

    JavaScript 事件属性绑定带参数的函数

    在JavaScript中,为了实现表现和控制相分离,可以通过0级的DOM事件属性或者2级的事件模型来实现,不过这两者在针对某个事件类型调用相应的事件句柄的时候,不能给事件句柄提供参数,也就是说,事件属性的值只能是一个函数引用。
    2009-03-03

最新评论