• javascript闭包详解


    闭包解释
    当内部函数被保存到外部时,会形成闭包,闭包会导致原有作用域链不释放,导致内存泄露(解释: 内存被占用,内存就变小了)

     

    闭包作用

    1实现共有变量(函数累加器) 

    2可以做缓存(存储结构)(eater)

    3可以实现封装,属性私有化(Person()) 

    4模块化开发,防止污染全局变量

    看下面例子:

    function a() {
        var a = 100
        function b() {
          a++
          console.log(a)                
        }
        return b
    }
    var demo = a()  //b带着作用域链出来(形成了闭包)  b defined 0 : aAO   1 : GO 
    demo() //101    //b执行    b doing   0 : bA0   1 : aAO   2 : GO   执行完销毁bAO   0 : aAO   1 : GO
    demo() //102    //b执行    b doing   0 : bA0   1 : aAO   2 : GO   执行完销毁bAO   0 : aAO   1 : GO

    闭包会导致多个执行函数公用一个公有变量,看一下例子

    function test() {
       var arr = []
       for(var i = 0; i < 10; i++) {
         arr[i] = function() {
            console.log(i)
         }
       }
       return arr
    }
    var myArr = test()
    for(var j = 0; j < 10; j++) {
       myArr[j]()  //输出10个10  公用同一个testAO
    }

    为了避免公用一个作用域,可以通过立即执行函数给每一个arr[i]独立的作用域,如下改造例子

    function test() {
        var arr = []
        for(var i = 0; i < 10; i++) {
            (function(a) {
                arr[a] = function() {
                    console.log(a)
                }
            }(i))
        }
        return arr
    }
    var myArr = test()
    for(var j = 0; j < 10; j++) {
        myArr[j]()  //输出1,2,3...8  每个执行函数有对应的一个立即执行函数的AO,每个AO的互相独立
    }                    

    闭包变量私有化

    var inherit = (function() {
      var F = function() {}  //变量私有化
      return function() {
      }
    }())

    实际例子如下

    function Person(name, wife) {
      var perpareWife = 'xiaoli'  //闭包,私有变量
      this.name = name
      this.wife = wife   this.divorce = function() {     this.wife = perpareWife   },   this.changePerpareWife = function(target) {     perpareWife = target   },   this.sayPerpareWife = function() {     console.log(perpareWife)   } } var person = new Person('lyj', 'xiaozhang') console.log(person.perpareWife) //undefined perpareWife属性是私有的,不能直接访问,只能通过方法去访问

    再看一下闭包例子

    function fun(n,o) {
       console.log(o)
       return {
           fun:function(m){
          return fun(m,n);
        }
      };
    }
    var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);
    var b = fun(0).fun(1).fun(2).fun(3);
    var c = fun(0).fun(1);  c.fun(2);  c.fun(3);

     最后答案   undefined   0   0   0

         undefined   1   2   3

         undefined   0   1   1

    end!!!

  • 相关阅读:
    1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    1389. Create Target Array in the Given Order
    1385. Find the Distance Value Between Two Arrays
    1382. Balance a Binary Search Tree
    PHP的 __DIR__ 作用【转】
    PHP:Allowed memory size of 134217728 bytes exhausted问题解决方法【转】
    PHP: POST Content-Length of xxx bytes exceeds the limit of 8388608 bytes【转】
    PhpStorm 如何快速查找文件【转】
    .gitkeep的作用【转】
    php copy 函数使用 【转】
  • 原文地址:https://www.cnblogs.com/lyjfight/p/13814698.html
Copyright © 2020-2023  润新知