zoukankan      html  css  js  c++  java
  • js-闭包(权威指南版)

    作者:zccst

    Js代码  收藏代码
      1. //1,闭包是词法作用域(作用域在定义时决定,不是在调用时决定)  
      2. var scope = "global scope";  
      3. function checkscope(){  
      4.     var scope = "local scope";  
      5.     function f(){  
      6.         return scope;  
      7.     }  
      8.     return f;  
      9. };  
      10. var r = checkscope()();  
      11. console.log(r);//local scope  
      12.   
      13.   
      14. //2,闭包可以捕捉到单个函数调用的局部变量,并将这些局部变量用做私有状态。  
      15. var uniqueInteger = (function(){  
      16.                         var counter = 0;  
      17.                         return function(){  
      18.                             return counter++;  
      19.                         }  
      20.                     }());  
      21. //分析:这是一个嵌套的函数。当外部函数返回之后,其它任何代码都无法访问counter变量,只有内部的函数才能访问它。  
      22.   
      23. //引申1:  
      24. function counter(){  
      25.     var n = 0;  
      26.     return {  
      27.         count:function(){return n++;},  
      28.         reset:function(){n=0;}  
      29.     };  
      30. }  
      31. var c = counter(), d = counter();  
      32. console.log(c.count());//0  
      33. console.log(d.count());//0  
      34. console.log(c.reset());  
      35. console.log(c.count());//0  
      36. console.log(d.count());//1  
      37. /* 
      38. 批注:每次调用counter(),都会创建一个新的作用域链和一个新的私有变量。因此,如果调用counter()两次,则会得到两个计算器对象,而且彼此包含不同的私有变量,调用其中一个计数器对象的count()和reset()不会影响到另外一个对象。 
      39. */  
      40.   
      41.   
      42. //引申2:  
      43. function counter(n){  
      44.     return {  
      45.         get count(){return n++;},  
      46.         set count(m){  
      47.             if(m >= n) n=m;  
      48.             else throw Error("只能越来越大,不能越来越小");  
      49.         }  
      50.     };  
      51. }  
      52. var c = counter(1000);  
      53. console.log(c.count);//1000  
      54. console.log(c.count);//1001  
      55. c.count = 2000;  
      56. console.log(c.count);//2000  
      57. c.count = 2000;//Error  
      58. /* 
      59. 批注:这个版本并未声明局部变量,只是使用参数n来保存私有状态,属性存取器方法可以访问n,这样的话,调用counter()的函数就可以制定私有变量的初始值了。 
      60. */  
      61.   
      62.   
      63. function constfuncs(){  
      64.     var funcs = [];  
      65.     for(var i= 0; i<10; i++){  
      66.         funcs[i] = function(){  
      67.             return i;  
      68.         };  
      69.     }  
      70.     return funcs;  
      71. }  
      72. var funcs = constfuncs();  
      73. console.log(funcs[5]());//10  
      74. /*批注,这些闭包都是在同一个函数调用中定义的,因此他们可以共享变量i。 
      75. 所有的闭包都共享这一个值,因此数组中的函数的返回值都是同一个值,这不是我们想要的结果。 
      76. */  
      77.   
      78. //还有注意this的关键字,而不是变量。每个函数调用都包含一个this值,如果闭包在外部函数里是无法访问this的,除非外部函数将this转存为一个变量:  
      79. var self = this;//将this保存至一个变量中,以便嵌套的函数能够访问它。 
  • 相关阅读:
    高分辨率下IE浏览器缩放导致出现右侧滚动条问题的解决
    Asp.Net Core 项目实战之权限管理系统(6) 功能管理
    Asp.Net Core 项目实战之权限管理系统(5) 用户登录
    Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
    Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
    Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计
    Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端
    Base-64 字符数组或字符串的长度无效等问题解决方案
    Asp.Net Core 项目实战之权限管理系统(0) 无中生有
    SEO
  • 原文地址:https://www.cnblogs.com/shsgl/p/4289934.html
Copyright © 2011-2022 走看看