美文网首页
*闭包下[JavaScript_008]

*闭包下[JavaScript_008]

作者: 六亲不认的步伐 | 来源:发表于2019-03-14 12:39 被阅读0次

    闭包


    示例代码

        function test(){
            var arr = [];
            for(var i = 0 ; i<10;i++)
            {
                  arr[i] = function(){
                        document.write(i);
                  }
            }
            return arr;
        }
        var  myArr =  test();
        for(var j = 0 ; j<10;j++)
            {
                  myArr[j]();//结果为10个10
            }
    

    原因解析 :在进行arr赋值时,由于方法体并没有执行,所以10个方法的i是共用的,在执行完test()后,此时的i相当于缓存在myArr中,且存入的值是test()的AO销毁前值,在销毁之前i存储的值是10
    解决方法:使用立即执行函数处理

        function test(){
            var arr = [];
            for(var i = 0 ; i<10;i++)
            {
                (function(k){//此处隐式使用闭包的存储功能,存储的内容为k的数据
                  arr[k] = function(){
                        document.write(k);
                   }
                }(i));//使用立即执行函数的实参,当执行myArr[i]时,查询的变量i即就转化为对应的立即执行函数的形参k
            }
            return arr;
        }
        var  myArr =  test();
        for(var j = 0 ; j<10;j++)
            {
                  myArr[j]();//结果为10个10
            }
    

    代码练习

        var x = 1;
        if(function c(){}){
              x+=typeof(c);
        }
        console.log(x);//输出结果为1undefined
    

    相关文章

      网友评论

          本文标题:*闭包下[JavaScript_008]

          本文链接:https://www.haomeiwen.com/subject/uugtmqtx.html