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变量的一个副本, 因此就可以返回各自不同的数值了.

  • 相关阅读:
    16个最棒的jQuery视差滚动效果教程
    16个最棒的WordPress婚纱摄影网站主题
    2013年最受欢迎的16个HTML5 WordPress主题
    16个最佳PSD文件下载网站
    16个最热门的 Android Apps 推荐下载
    前端工程师应该都了解的16个最受欢迎的CSS框架
    16个最好并且实用的jQuery插件【TheTop16.com】
    16个最受欢迎的Magento电子商务主题【TheTop16.com】
    [Nunit] System.Net.Sockets.SocketException : An existing connection was forcibly closed by the remote host
    WORD
  • 原文地址:https://www.cnblogs.com/haoyijing/p/5790433.html
Copyright © 2011-2022 走看看