zoukankan      html  css  js  c++  java
  • 再看函数的闭包

     1 function createFunctions(){
     2 
     3         var result = [];
     4 
     5         for(var i = 0; i < 10; i++){
     6             result[i] = function(){
     7                 return i;
     8             };
     9             console.log(i);
    10         }
    11         console.log("最终i : ", i);
    12 
    13         //return result;
    14         console.log(result[0]());// 10
    15         console.log(result[1]());// 10
    16         console.log(result[2]());// 10
    17         console.log(result[3]());// 10
    18         console.log(result[4]());// 10
    19         console.log(result[5]());// 10
    20         console.log(result[6]());// 10
    21         console.log(result[7]());// 10
    22         console.log(result[8]());// 10
    23         console.log(result[9]());// 10
    24         console.log(result[10]);// undefined
    25     }
    26 
    27     createFunctions();

    内存中仅保存全局作用域,但是闭包的情况有所不同!

    我们知道,函数在执行结束之后局部变量就会被回收,(全局作用域,本地活动对象)。以上为例,最终的i值没有被销毁,为 10. 所以result 中引用的i 一直是 10。

    但是通过改写:

     1 function createFunctions(){
     2 
     3         var result = [];
     4 
     5         for(var i = 0; i < 10; i++){
     6             result[i] = (function(num){
     7                 return function(){
     8                     return num;
     9                 };
    10             })(i);
    11             console.log(i);
    12         }
    13         console.log("最终i : ", i);// 10
    14 
    15         //return result;
    16         console.log(result[0]());// 0
    17         console.log(result[1]());// 1
    18         console.log(result[2]());// 2
    19         console.log(result[3]());// 3
    20         console.log(result[4]());// 4
    21         console.log(result[5]());// 5
    22         console.log(result[6]());// 6
    23         console.log(result[7]());// 7
    24         console.log(result[8]());// 8
    25         console.log(result[9]());// 9
    26         console.log(result[10]);// undefined
    27     }
    28     createFunctions();

    上面代码相当于:

     1 function createFunctions(){
     2 
     3         var result = [];
     4 
     5         for(var i = 0; i < 10; i++){
     6             result[i] = (function(num){
     7                 num = i;
     8                 return function(){
     9                     return num;
    10                 };
    11             })();
    12             console.log(i);
    13         }
    14         console.log("最终i : ", i);// 10
    15 
    16         //return result;
    17         console.log(result[0]());// 0
    18         console.log(result[1]());// 1
    19         console.log(result[2]());// 2
    20         console.log(result[3]());// 3
    21         console.log(result[4]());// 4
    22         console.log(result[5]());// 5
    23         console.log(result[6]());// 6
    24         console.log(result[7]());// 7
    25         console.log(result[8]());// 8
    26         console.log(result[9]());// 9
    27         console.log(result[10]);// undefined
    28     }
    29     createFunctions();
  • 相关阅读:
    记一次java程序内存溢出问题
    js 对象数据观察者实现
    requirejs和seajs使用感受
    maven根据不同的运行环境,打包不同的配置文件
    Quartz .net 一直运行失败
    Sql2008R2 日志无法收缩解决方案
    win7 64位英文版 ado驱动
    KB4284826 远程桌面发生身份验证错误,要求的函数不受支持
    Delphi System.zip patch with ZIP64 and LZMA supports
    native excel 文件已经打开的判断
  • 原文地址:https://www.cnblogs.com/chuyu/p/3370460.html
Copyright © 2011-2022 走看看