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保存至一个变量中,以便嵌套的函数能够访问它。 
原文地址:https://www.cnblogs.com/shsgl/p/4289934.html