闭包

了解闭包(函数的函数)的肯定知道,输出的是10个10,但是你要具体解释呢?

function test() {
    var arr=[];
    for(var i=0;i<10;i++){
        arr[i]=function () {
            console.log(i);
        }
    }
    return arr;
}
var myArr=test();
for(var j=0;j<10;j++){
    myArr[j]();
}
//10,10,10,10,10,10,10101010

 我们需要知道console.log(i);这句是在什么时候调用的;

return出去的时候还未被调用;

是在给arr全部都返回出去了,才去调用的;

此时i早已变成10了。

test执行完后,test和ao已经断线。但是他的ao没有销毁的,被arr里面function有另一条线连接着;

test里面的AO,i变量现在的结果是10,而且被arr里面每个function拽住;

如想正确输入0,1,2,3,4,5,6,7,8,9,10

1.立即执行函数

function test() {
    var arr=[];
    for(var i=0;i<10;i++){
        (function(j){
           arr[j]=function () {
               console.log(j);
            }
        })(i)
    }
    return arr;
}
var myArr=test();
for(var j=0;j<10;j++){
    myArr[j]();
}
//0,1,2,3,4,5,6,7,8,9,10

2.借用外部的参数

function test() {
    var arr=[];
    for(var i=0;i<10;i++){
        arr[i]=function (num) {
           console.log(num);
         }
    }
    return arr;
}
var myArr=test();
for(var j=0;j<10;j++){
    myArr[j](j);
}
//0,1,2,3,4,5,6,7,8,9,10
原文地址:https://www.cnblogs.com/ssszjh/p/14361595.html