js闭包学习笔记

  javascript 闭包是一个很有趣的东东。看了些相关资料(http://www.cnblogs.com/TomXu/archive/2011/12/30/2288372.html 这个很给力),对其印象最深刻的是:实现了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
复制代码

 当在一个函数 outter 内部定义另一个函数 inner,而 inner 又引用了 outter 作用域内的变量,在 outter 之外使用 inner 函数,则形成了闭包。在闭包内部的变量将被保持,就像上面的i。

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文件。实在是太好了。

 

posted @   ASER_1989  阅读(450)  评论(1编辑  收藏  举报
编辑推荐:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示