猿问

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


回首忆惘然
浏览 409回答 2
2回答

宝慕林4294392

如果不用var n=i接收i的值,直接返回i,那么后面函数运行的时候找不到i的值,就回去上层作用域寻找,而上层作用域循环结束,i的值为10,所以会始终返回10。而使用了var n=i,想当于把每次循环中i的值保存在自调函数的内部,返回函数运行的时候找不到n的值也会去上层作用域寻找,找到了自调函数内部的n的值,分别对应0-9。可以这么改,作用相同for(var i=0;i<10;i++){&nbsp;&nbsp; fnArr[i]=(function(i){&nbsp;&nbsp; &nbsp; return function(){&nbsp;&nbsp; &nbsp; &nbsp; return i&nbsp; &nbsp; }&nbsp;&nbsp; })(i);&nbsp;}

绝地无双

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

相关分类

JavaScript
我要回答