zoukankan      html  css  js  c++  java
  • 《JavaScript》高级程序设计第7章 函数表达式

    7.2 闭包

    定义: 闭包是指有权访问另一个函数作用域中的变量的函数.

    理解闭包:

    • 作用域链: 当某个函数被调用时,会创建一个执行环境以及相应的作用域链. 作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位.....直至作为作用域链终点的全局执行环境
    • 变量对象: 全局函数的变量对象始终存在, 而局部环境的变量对象只在函数执行的过程中存在.
    • 一般来讲, 当函数执行完毕后, 局部活动对象就会被销毁, 内存中仅保存全局作用域(全局执行环境中的变量对象)但是闭包的情况又不同
    • 在另一个函数内部定义的函数对象会将包含函数(即外部函数)的活动对象添加到它的作用域链中.
    • 对应闭包, 在外部函数执行完毕后, 其活动对象也不会被销毁, 因为匿名函数的作用域链仍然在引用这个活动对象. 即外部函数返回后, 其执行环境的作用域链会被销毁,但它的活动对象仍然会留在内存中, 直到匿名函数被销毁后, 其活动对象才会被销毁.
    • 因为闭包会携带包含它的函数的作用域, 因此会比其他函数占用更多的内存

    闭包的副作用:

    • 闭包只能获取包含函数中任何变量的最后一个值. 因为闭包所保存的是整个变量对象, 而不是某个特殊的变量
    • function createFunctions(){
          var result = new Array();
          for(var i=0; i<10; i++){
              result[i] = function(){
                  return i;
              };
          }
          return result;
      }
      

        以上这个函数会返回一个函数数组,但是其每个函数都会返回10. 因为每个函数的作用域链中都保存着createFunctions()函数的活动对象,所以它们引用的都是同一个变量i

    • 改进方法:
      function createFunctions(){
          var result = new Array();
          for( var i=0; i<10; i++){
              result[i] = function(num){
                  return function(){
                      return num;
                  };
              }(i);
           }
          return result;
      }
      

        创建另一个匿名函数强制让闭包的行为符合预期.

         这样一来, result数组中的每个函数都有自己num变量的一个副本, 因此就可以返回各自不同的数值了.

  • 相关阅读:
    MVP模式与MVVM模式
    webpack的配置处理
    leetcode 287 Find the Duplicate Number
    leetcode 152 Maximum Product Subarray
    leetcode 76 Minimum Window Substring
    感知器算法初探
    leetcode 179 Largest Number
    leetcode 33 Search in Rotated Sorted Array
    leetcode 334 Increasing Triplet Subsequence
    朴素贝叶斯分类器初探
  • 原文地址:https://www.cnblogs.com/haoyijing/p/5790433.html
Copyright © 2011-2022 走看看