美文网首页
达摩碎碎念--包治百病--闭包

达摩碎碎念--包治百病--闭包

作者: 达摩会武术 | 来源:发表于2019-01-08 12:05 被阅读0次
    1-- 闭包的认识:

    闭包可以让函数访问所有的变量和函数,只要这些变量和函数存在于该函数声明时的作用于内就行。

          var outerValue = '包治百病';                                       //#1
    
          function outerFunction() {
    
           console.log(outerValue);         //#2
           console.log(laterValue);          //#3
    
          }
          var laterValue=在函数之后定义的值";
    
          outerFunction();                                                //#4
    
          console.log(qi);    //#5
          var qi="你不知道的JavaScript";
    

    上面是一个简单的闭包,说明问题:#2和#3都能打印出来相应的值,而#5是undefined;下面是关于闭包的有趣概念:
    |. 作用于之外的所有变量,即便是函数声明之后的那些声明,也都包含在闭包中。
    ||.相同作用于内,尚未声明的变量不能进行提前引用。
    |||.尽管闭包十分有用,但是他们的使用并非完全没有开销,比暴力的信息会一直保存在内存里,直到这些信息确保不再被使用,或页面卸载时,JavaScript引擎才能清理这些信息。


    2 --下面介绍一下闭包的使用

    1.私有变量

    function Ninja() {                                            //#1
    
        var feints = 0;                                             //#2
    
        this.getFeints = function(){                                //#3
        return feints;                                            //#3
    };                                                          //#3
    
        this.feint = function(){                                    //#4
        feints++;                                                 //#4
    };                                                          //#4
    }
    
      var ninja = new Ninja();                                      //#5
    
      ninja.feint();                                                //#6
      console.log(ninja.getFeints());
      if(ninja.feint === undefined){  //#7  
      console.log("不可以访问到feints");                 //#7
    }                                
      if(ninja.getFeints() == 1){           //#8  
      console.log("可以访问内部私有变量")                  //#8
    } 
    

    上面例子得到的结果是:"可以访问到内部私有变量".所以有,可以通过存取方法获取私有变量的值,但是不能直接访问私有变量。

    2.绑定函数上下文
    先看下面的这个小例子出现的问题:

      <button id="test">Click Me!</button> 
    <script>  
        var button = {                                                 //#2
            clicked: false,
            click: function(){                                           //#3
              this.clicked = true;
              console.log(button.clicked);      //#4
              console.log(this);      //#4-1
            }
          };
    
          var elem = document.getElementById("test");                    //#5
          elem.addEventListener("click",button.click,false);             //#5
    </script>
    

    这里面使用#4打印出来的结果是false,而不是true;#4-1打印出来的this是button这个元素,而不是button这个对象;因为DOM2级事件处理程序和DOM0级的事件处理程序都是依附在元素的作用于里面运行的,也就是说,绑定后,this指向的是button这个元素,而不是button对象,所以会打印出来上面的结果。

    接着,我们来介绍一个通过使用闭包来绑定函数上下文的例子:

        <button id="test">Click Me!</button>
    
        <script>
          function bind(context,name){                                 //#1
            return function(){                                         //#1
              return context[name].apply(context,arguments);           //#1
            };                                                         //#1
          }                                                            //#1
    
          var button = {
            clicked: false,
            click: function(){
              this.clicked = true;
              assert(button.clicked,"The button has been clicked");
              console.log(this);
            }
          };
    
          var elem = document.getElementById("test");
          elem.addEventListener("click",bind(button,"click"),false);     //#2
    
        </script>
    

    这里面特别精髓的地方就是那个bind函数了,这个方法创建并返回一个匿名函数,该匿名函数使用apply()调用了原始函数。
    |.bind函数的context参数就是 -- 要设置的上下文对象
    ||.bind函数的name参数就是 -- 方法名称

    相关文章

      网友评论

          本文标题:达摩碎碎念--包治百病--闭包

          本文链接:https://www.haomeiwen.com/subject/noiurqtx.html