我想通过闭包在网页上将 1-10 打印出来
function test() {
var arr = [];
for(var i = 0; i < 10; i++){
arr[i] = function () {
window.console.log(i);
document.write(i + " ");
}
}
return arr;
}
myArr = test();
for(var j = 0; j < myArr.length; j++){
myArr[j]();
}
可是没想到运行结果会变成这个样子
这里的for循环不是每一次都会生成一个函数将 i 打印出来吗?我在下面循环调用函数执行,为什么打印出来的结果不是我想要的 0 1 2 3 4 5 6 7 8 9 呢?
其实在循环的时候 我们只是很多个 function() 函数但是并没有调用
这样的话 我们只是生成了10个如出一致的的
function () {
window.console.log(i);
document.write(i + " ");
}
这里面的 i 跟随 for 循环里面的 i 改变 到了最后for循环结束时 i = 10 这时候再循环调用这10个相同function 便会打印出10 个 一样的结果
那么究竟通过for循环生成10个打印数值不相同的 function 呢?
function test() {
var arr = [];
for(var i = 0; i < 10; i++){
(function (t){//通过立即执行函数将每次生成的 function 立即添加到数组中
arr[t] = function () {
window.console.log(t);
}
}(i))
}
return arr;
}
myArr = test();
for(var j = 0; j < myArr.length; j++){
myArr[j]();
}
我们可以通过立即执行函数将循环得到的函数立即调用这样我们就可以保证我们的打印数值不会跟着循环时 i 的改变而发生改变?
学习笔记:有不当的地方,还望大神指出。