zoukankan      html  css  js  c++  java
  • 闭包函数

    一、变量的作用域

      要理解闭包,首先必须理解Javascript特殊的变量作用域。

      变量的作用域无非就是两种:全局变量和局部变量。

      函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

      function f1(){                                             
        var n=999;
      }

      alert(n); // error

      function f1(){
        n=999;
      }

      f1();

      alert(n); // 999

    二、如何从外部读取局部变量?

      function f1(){

        n=999;

        function f2(){
          alert(n);
        }

        return f2;

      }

      var result=f1();

      result(); // 999

    三、闭包的概念

      闭包就是能够读取其他函数内部变量的函数。

      定义在一个函数内部的函数。

      在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

    四、闭包的用途

      一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问);

    五、使用闭包的注意点

      1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

      2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

    六、

      var name = "The Window";   
      var object = {   
        name : "My Object",   
        getNameFunc : function(){   
          return function(){   
            return this.name;   
         };   
        }   
         };   
         alert(object.getNameFunc()());  //The Window

    JavaScript闭包例子

    function outerFun()
     {
      var a=0;
      function innerFun()
      {
       a++;
       alert(a);
      }    
     }
    innerFun()

    上面的代码是错误的.innerFun()的作用域在outerFun()内部,所在outerFun()外部调用它是错误的.

    改成如下,也就是闭包:

    Js代码

    function outerFun()
    {
     var a=0;
     function innerFun()
     {
      a++;
      alert(a);
     }
     return innerFun;  //注意这里
    }
    var obj=outerFun();
    obj();  //结果为1
    obj();  //结果为2
    var obj2=outerFun();
    obj2();  //结果为1
    obj2();  //结果为2

    Javascript的垃圾回收机制

    在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。

  • 相关阅读:
    第二十九课 循环链表的实现
    第二十八课 再论智能指针(下)
    第二十七课 再论智能指针(上)
    第二十六课 典型问题分析(Bugfix)
    普通new和placement new的重载
    leetcode 581. Shortest Unsorted Continuous Subarray
    leetcode 605. Can Place Flowers
    leetcode 219. Contains Duplicate II
    leetcode 283. Move Zeroes
    leetcode 217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/sun-web/p/8334752.html
Copyright © 2011-2022 走看看