zoukankan      html  css  js  c++  java
  • 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文件。实在是太好了。

  • 相关阅读:
    七层网络模型
    nginx配置本地https
    kong结合consul
    kong添加upstream
    1.创建spring cloud父工程和子模块
    idea自动生成spring实体
    php的json_encode()之后float类型丢失精度
    windows下wnmp配置
    Call to undefined function imageftbbox()
    介绍一款比较好用的画图工具--PlantUml
  • 原文地址:https://www.cnblogs.com/aser1989/p/4292041.html
Copyright © 2011-2022 走看看