zoukankan      html  css  js  c++  java
  • JavaScript 闭包

    闭包

     

    1. 闭包有两个特性:

      1) 封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;

      2) 持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在系统中,闭包中的数据依然存在,从而实现对数据的持久使用。

     

    2. 闭包的缺点:

      使用闭包会占有内存资源,过多的使用闭包会导致内存溢出等。

     

    3. 闭包的使用

     

     1 // 经典的闭包实列如下:
     2 function f(x){              //外部函数
     3     var a = x;              // 外部函数的局部变量,并传递参数
     4     var b = function(){     // 内部函数 
     5         return a;           // 访问外部函数中的局部变量
     6     };
     7     a++;                    // 访问后,动态更新外部函数的变量
     8     return b;               // 返回内部函数
     9 }
    10 var c = f(5);               // 调用外部函数并且赋值
    11 console.log(c());           // 调用内部函数,返回外部函数更新后的值为6

     

    首先在 a 函数内定义了两个变量,一个是存储参数,另外一个是闭包结构,在闭包结构中保存着 b 函数内的 a 变量,默认情况下,当 a 函数调用完之后 a 变量会自动销毁的,但是由于闭包的影响,闭包中使用了外界的变量,因此 a 变量会一直保存在内存中,因此变量 a 参数没有随着 a 函数销毁而被释放,因此引申出闭包的缺点是:过多的使用闭包会占有内存资源,或内存溢出等可能性。

     

    在如下代码中有2个函数,f 函数的功能是:把数组类型的参数中每个元素的值分别封装在闭包结构中,然后把闭包存储在一个数组中,并返回这个数组。但是在函数 e 中调用函数 f 并向其传递一个数组 ["a","b","c"],然后遍历函数 f 返回的数组,我们运行打印后发现都是 c undefined。那是因为在执行 f 函数中的循环的时候,值虽然保存在 temp 中,但是每次循环后 temp 值在不断的变化,当 for 循环结束后,此时 temp 值为 c,同时 i 变为 3,因此当调用的时候打印出来的 temp 为 3,arrs[3] 变为 undefined,因此打印出 c undefined。

    解决闭包的缺陷我们可以再在外面包一层函数,每次循环的时候,把temp参数和i参数传递进去。如代码二:

     1 // 代码一
     2 function f(x) {
     3     var arrs = [];
     4     for(var i = 0; i < x.length; i++) {
     5         var temp = x[i];
     6         arrs.push(function(){
     7             console.log(temp + ' ' +x[i]); // c undefined
     8         });
     9     }
    10     return arrs;
    11 }
    12 function e(){
    13     var ar = f(["a","b","c"]);
    14     for(var i = 0,ilen = ar.length; i < ilen; i++) {
    15         ar[i]();
    16     }
    17 }
    18 e(); 
    19 // 代码二:
    20 function f2(x) {
    21     var arrs = [];
    22     for(var i = 0; i < x.length; i++) {
    23         var temp = x[i];
    24         (function(temp,i){
    25             arrs.push(function(){
    26                 console.log(temp + ' ' +x[i]); // c undefined
    27             });
    28         })(temp,i);
    29     }
    30     return arrs;
    31 }
    32 function e2(){
    33     var ar = f2(["a","b","c"]);
    34     for(var i = 0,ilen = ar.length; i < ilen; i++) {
    35         ar[i]();
    36     }
    37 }
    38 e2(); 

     

    学习资源:涂根华的博客 http://www.cnblogs.com/tugenhua0707/p/5046854.html

     

  • 相关阅读:
    正则校验录入日期是否有效(含润年)
    java截取字符串中字节长度【转】
    python基础总结(oop)
    python基础总结(函数)
    python基础总结(字符串)
    python基础总结(集合容器)
    python基础总结(判断语句*循环语句)
    python基础总结(基本类型与运算符)
    python爬虫相关的一些面试题
    python爬虫基本知识
  • 原文地址:https://www.cnblogs.com/xiaochechang/p/5740091.html
Copyright © 2011-2022 走看看