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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容