• 闭包问题


    今天捣鼓了一下关于闭包的几种情况,记录一下下哈

    这个例子首先是这样的

    function createFunctions(){
        var result=new Array();
        for(var i=0;i<10;i++){
        result[i]=function(){return i;};
    }
    alert(i);
    return result;
    
    }
    alert(creatwFunctions());
    alert(createFunctions()[0]());

    心里知道输出的是0~9,第一个alert不是,它是这样的function(){return i;};result[i]=function(){return i;};result[i]=function(){return i;};.......然后就凌乱了。

    傻完了后,第二个alert为10。

    当然了,10也不是我内心的想法。我的想法是它

    function creatFunctions(){
        var result=new Array();
        for(var i=0;i<10;i++){
        result[i]=(function(num){return  num;})(i);
    }
    return result;
    
    }
    alert(creatFunctions()); //输出结果是0,1,2,3,4,5,6,7,8,9

    这个才是我要的,那它们的区别呢?

    首先,这两个都是闭包(占用函数外部的变量,是变量无法消除)。

    第一种情况,i永远都是那个i(相当于一个指针),存入result数组里面的值其实就是指针i,指向的那个具体的值也是同一个,随着循环不断在变化,循环完成了,值定下来了(等于10),数组里装的值也就定下来了(全部是10)。

    第二种情况呢,是借用立即执行函数。(function(){})(i);立即执行函数是把i作为参数传到函数里面。

    这个好处是这样的:参数是按值传递,这样函数获得的i就不是一个指针了,而是i的一个副本。那么,数组里面的各个值(函数执行后返回得值)就毫无瓜葛,你是你,我是我。

    还有一种情况

    function creatFunctions(){
        var result=new Array();
        for(var i=0;i<10;i++){
        result[i]=(function(num){
            return  function(){return num;};
        })(i);
    }
    return result;
    
    }
    alert(creatFunctions());//得到一系列的返回函数 alert(creatFunctions()[
    1]());// 1

    这个和上面的效果是一样的,只是在取数组值上方法不一样。

    上面立即执行的函数是return num,可直接得到数组中num值。后面的一种return function(){return num},返回的是一个函数,数组中存的也是函数,获得值时要调用数组中的函数以得到函数的值(说明白点就是0,1,2...)

    以上的例子是书本里面的,然后把自己的理解加书上的讲述综合一下,初学者,有错误请指正谅解哈!

    我要慢慢的往前爬啊,喵~
  • 相关阅读:
    eclipse 闪退原因
    Ansj分词的使用
    pycharm实现sublime的显示效果,很惊艳哦
    使用pycharm以及用pycharm句子切分调试
    安装pytorch0.4.0
    vim设置一个tab为4个空格,设置行号
    读取html文件,让其中的内容和notepad打开这个html的样子一样。
    把变量,比如矩阵的值存储到文件里面去
    xpath分析 html文件抽正文的过程
    quepy
  • 原文地址:https://www.cnblogs.com/hellolm/p/4396860.html
Copyright © 2020-2023  润新知