JS闭包,为什么打印的是10个10

这段代码执行后会打印10个10为什么

function fn() {

var aa = new Array();

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

aa[index] = function () {

document.write("
" + index);

};

}

return aa;

}

var fns = fn();

for (let i = 0; i < fns.length; i++) {
//然后调用fns这个存有函数的数组,fns;
}

题主的代码没有形成闭包,改成下面的就行,或者fn中的index改为let申明


    function fn() {
        var aa = new Array();
        for (var index = 0; index < 10; index++) {
            aa[index] = (function (index) {
                return function () {//返回的匿名函数引用到立即执行的匿名函数的index变量,形成了闭包。题主原来的代码只是引用到index最后循环的值,所有打印的都是10
                    document.write("<br>" + index);
                };
            })(index)
        }
        return aa;
    }

    var fns = fn();
    for (let i = 0; i < fns.length; i++) {
        fns[i]();
    }

有let申明变量其实不要搞闭包了,let只有语句体中能访问,自动形成了闭包,不用按照es5那样用立即执行的匿名函数+返回匿名函数这种形式这么麻烦


    function fn() {
        var aa = new Array();
        for (let index = 0; index < 10; index++) {
            aa[index] = function () {
                document.write("<br>" + index);
            };
           
        }
        return aa;
    }

    var fns = fn();
    for (let i = 0; i < fns.length; i++) {
        fns[i]();
    }

有帮助或启发麻烦点个采纳【本回答右上角】,谢谢~~

已经形成闭包了,for循环遍历后,最后的index变量保持在10,所以你的函数输出的时候就都是用的那个index为10的变量,把循环的var改成let就不会形成闭包了