这段代码执行后会打印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就不会形成闭包了