为了账号安全,请及时绑定邮箱和手机立即绑定

js闭包问题

js闭包问题

回首忆惘然 2019-03-11 16:14:00
for(var i=0;i<10;i++){    fnArr[i]=(function(){        var n=i;        return function(){            return n        }    })();}for(var i=0;i<10;i++){        (function(){            var n=i;        fnArr[i]=function(){            return n        };        })()    }以上都是可以让 fnArr[3]输出3,而不是10,但是为什么一定都要声明n=i呢?去了这句话 就不能正确输出了
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

如果不用var n=i接收i的值,直接返回i,那么后面函数运行的时候找不到i的值,就回去上层作用域寻找,而上层作用域循环结束,i的值为10,所以会始终返回10。


而使用了var n=i,想当于把每次循环中i的值保存在自调函数的内部,返回函数运行的时候找不到n的值也会去上层作用域寻找,找到了自调函数内部的n的值,分别对应0-9。


可以这么改,作用相同


for(var i=0;i<10;i++){ 

  fnArr[i]=(function(i){ 

    return function(){ 

      return i

    } 

  })(i); 

}


查看完整回答
反对 回复 2019-03-27
?
绝地无双

TA贡献1946条经验 获得超4个赞

外层和内层是两个作用域,每次变量访问都是访问最近的,如果没有var n = i这一句话,就访问到顶级作用域了,而此时i已经到10了


查看完整回答
反对 回复 2019-03-27
  • 2 回答
  • 0 关注
  • 408 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信