• js闭包


    js闭包的官方解释:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。个人理解就是:就是一个在函数内部的函数,他可以访问他的外部函数的变量的AO里面的所有值。当然GO里面的值也可以访问。(在了解闭包前,你必须先了解js的作用域,作用域链)。反过来说,当函数内部包含一个内部函数,并且被返回保存该内部函数,就会产生会产生闭包;这样还是有点抽象,看一个例子;

     1 <script type="text/javascript">
     2         //总结:当内部函数被返回到外部并且保存时,一定会产生闭包,闭包会产生 原来的作用域链不释放,过度的闭包会导致内存泄漏,或者加载过慢。
     3         function breadMgr(num){
     4             var breadNum = arguments[0] || 0;
     5             function supply(){
     6                 breadNum += 10;
     7                 console.log(breadNum);
     8                  }
     9 
    10             function sale(){
    11                 breadNum --;
    12                 console.log(breadNum);
    13             }
    14             return [supply,sale];
    15         }
    16 
    17         var breadMgr = breadMgr(50);
    18         breadMgr[0]();
    19         breadMgr[1]();
    20 
    21         //第二个例子,解释一下结果是什么,为什么//需要联系AO 和GO
    22         function test1(){
    23             var arr = [];
    24             for(var i = 0;i < 10;i++){
    25                 arr[i] = function(){
    26                     console.log(i+",");
    27                 }
    28 
    29             }
    30             return arr;
    31         }
    32         var myArr = test1();
    33         for(var j = 0;j<10;j++){
    34             myArr[j]();
    35         }
    36     </script>

    解析:

    breadMgr[0]();的结果是60

    breadMgr[0]();的结果是59

    下面的for循环下面的结果是 10 个10;

    这里,我们先只看第一例子:

    
    
     1 function breadMgr(num){
     2             var breadNum = arguments[0] || 0;
     3             function supply(){
     4                 breadNum += 10;
     5                 console.log(breadNum);
     6                  }
     7 
     8             function sale(){
     9                 breadNum --;
    10                 console.log(breadNum);
    11             }
    12             return [supply,sale];
    13         }
    14 
    15         var breadMgr = breadMgr(50);
    16         breadMgr[0]();
    17         breadMgr[1]();

    作用域 GO: breadMgr = function breadMgr(){...}
    执行:
      AO:breadNum = undefined
        breadNum = 50
    执行:

        supply = function supply(){...}
        sale = function sale(){...}
        返回 [supply,sale];
    breadMgr[0]()的执行结果就是 60;
    breadMgr[1]()的执行结果就是59;

    第二个例子:
     1 function test1(){
     2             var arr = [];
     3             for(var i = 0;i < 10;i++){
     4                 arr[i] = function(){
     5                     console.log(i+",");
     6                 }
     7 
     8             }
     9             return arr;
    10         }
    11         var myArr = test1();
    12         for(var j = 0;j<10;j++){
    13             myArr[j]();
    14         }

    预解析 GO: test1= function test1(){....}

         myArr = undefined

    执行:test1预解析:arr = undefined

           执行:  arr = []

                arr[i] = function(){console.log(i+',")}

            总共执行10次,最后i 的结果是10;

    这里解释一下,for(var i = 0; i<10;i++) 等同于 var i = 0;if(i<10){i++;.......};所以这里的i就是 10;

    i = 10 ,数组下标是 0-9 ,每个值都是function(){console.log(10+',")},

    执行 for(var j=0;j<10;j++)后,打印每个结果就是 10 ;

    最后还介绍一下,闭包的写法:

     1 <script type="text/javascript">
     2         //return 写法
     3         function test() {
     4             var a = 1;
     5             function add() {
     6                 a++;
     7                 console.log(a);
     8             }
     9             return add;//这里 可以写成 window.add = add;
    10         }
    11         var add = test();
    12         add();
    13 
    14         // window写法
    15         function test2() {
    16             var b = 1;
    17             function add1() {
    18                 b++;
    19                 console.log(b);
    20             }
    21             window.add1 = add1;
    22         }
    23         test2();
    24         add1();
    25     </script>
  • 相关阅读:
    performance benchmark : memcached vs Kyoto Tycoon
    Adhesive框架系列文章应用程序信息中心模块实现
    神奇的Redis
    使用代码测试ASP.NET MVC2执行流程
    linq2sql代码大全
    7/17博客园活动浅谈网站架构中缓存的应用所有资料
    浅谈.NET下的多线程和并行计算(十四)并行计算前言
    公司.NET 3.5培训资料分享
    mongodb分片集群(sharding with replica set)配置
    mongodb有关的研究
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/10953978.html
Copyright © 2020-2023  润新知