美文网首页
for循环闭包

for循环闭包

作者: 饥人谷_風逝 | 来源:发表于2017-03-16 19:59 被阅读0次

    问题:下面的代码输出多少?修改代码让fnArri 输出 i。使用两种以上的方法

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(){
            return i;
        };
    }
    console.log( fnArr[3]() ); 
    输出结果是10
    

    解决:
    方法1 立即执行函数,使用形参num传递参数(即每执行一次内层,有一个新的参数num)

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        (function (num){fnArr[i] =  function(){
            return num;
        }})(i);
    }
    console.log( fnArr[3]() ); 
    

    方法2 将变量i保存在匿名函数自身

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        (fnArr[i] =  function(){
            return arguments.callee.i;
        }).i=i;
    }
    console.log( fnArr[3]() ); 
    

    方法3 立即执行函数,局部变量传递参数

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        (function(){
            var temp=i
            fnArr[i] =  function(){
                return temp;
            }
        })();
    }
    console.log( fnArr[3]() ); 
    

    方法4 返回函数的形式(在循环中,i由形参arg传入)

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  function(arg){
            return function()
            {return arg;}
        }(i);
    }
    console.log( fnArr[3]() ); 
    

    方法5 新建函数实例(Function生成的函数在创建时解析)

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] = new Function("return(" + i + ");");//new可以省略
    }
    console.log( fnArr[3]() ); 
    

    作者風逝,参考:http://www.cnblogs.com/syf/archive/2012/10/04/2711828.html

    相关文章

      网友评论

          本文标题:for循环闭包

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