经典问题解析
for循环变量提示的问题
我们在进行dom树绑定循环依次执行的时候,会不会出现所有点击的数都是最后一个的情况,当时我很是懵逼,最近刚好有时间谢谢博客,就把我的见解给贴出来:
涉及的知识点:
闭包,作用域,var声明,预解析变量提升的问题
我们首先要知道一个概念:
1 函数在执行的前一刻会有一个预解析的过程:
这里的预解析会让函数内的变量提升和该函数内的函数声明提升
当然了首先是生成argument 对象,argument保存的是实参
我们要知道闭包的概念:
1 返回一个函数,通过这个函数对外部的函数的变量进行操纵…
看到这篇文章的,如果这部分知识不太理解的,可以去看关于
(AO/GO/VO/scope作用域/this的问题)
前面说过var声明在预解析阶段会进行变量提升
比如我想要让函数执行的话,我们需要给函数加上一个函数执行符号()
但是我们这里是想让函数输出一个数组
var arr =[];
for(var i =0 ;i<10;i++)
{
var arr = function()
{
document.write(i+’ ');
}
}
我们让给数组填入相应的函数
注意我们这里并不是函数的执行,而是函数的声明
也就是说只是存入但是并不执行
我们将这个arr数组return出去
用一个变量newArr 去接收
然后进行循环一次执行
for(var i = 0;i<10;i++)
{
newArr’[i]’();
}
函数的执行
全部的语句是这样的
我们在没有解决问题之前,会有一个问题,for循环以后定义了每一个函数表达式,但是这些表达式并没有执行,而是继续进行迭代,当for循环执行完以后,我们返回arr数组,然后挨个进行执行,但是并不是我们想要的0,1,2,3,4,5,6,7,8,9,而是全部都是10,这是因为for循环已经执行完了后外面的函数访问里面的属性的时候i已经是10了,所以取到的结果都是10,我们解决问题的方法就是立即执行函数,程序一开始运行就立即执行,这样我们取到的每一个值都是已经迭代过好的变量