js闭包问题

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呢?去了这句话 就不能正确输出了

阅读 1.9k
2 个回答

如果不用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); 
}

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题