for循环闭包

问题:下面的代码输出多少?修改代码让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循环闭包)