笔者最近做了很多的应聘笔试题,其中有一个让我印象特备深刻,关于在一个for循环里边些函数运用到for循环里边定义的变量的问题,废话不多说,先上代码,大家可以看看这段代码最后的结果是什么:
var array=[];//定义一个数组,空的 for(var i=0;i<3;i++){ array[i]=function(){ alert(i); } } array[0](); array[1](); array[2]();
初学者可能咋一看,想,这不是很简单吗?依次弹出0,1,2。亲爱的同学们,你可以亲自试一试,结果会出乎你的意料,结果是弹出三次3,这道底是为什么呢?让我们来仔细研究一下。
这段代码在执行的时候首先会新建立一个全局数组array,这是个空数组。在每一次for循环的时候,在进入for循环内部,是不会执行(进入)array[i]的函数体内部的内容的,但是此时会把array[i]加入到全局的作用域链中去。在for循环结束之后(此时i应该等于3了),也就是在函数初始化结束之后,我们现在真真正正的调用一下我们刚刚创建的函数,此时,程序才回去执行函数体内部的东西,要输出i的值,但是此时i的值已经是3了,所以输出来的全是3。
找到了这个问题,我们现在来想想办法解决它吧,可惜,笔者的js功底薄,还木有找到解决数组函数的这个问题的办法。不过,如果是对象(如通过li标签获取的一串文档对象),那我就可以解决他了,如下:
var array=document.getElementsByTagName("li");//获取节点元素,当然不会只有一个接点 for(var i=0;i<3;i++){ array.index=i; array[i].onclick=function(){ alert(this.index); } } //点击就可以触发函数执行了
本文出自 “D调小蜗牛” 博客,转载请与作者联系!
原文地址:http://10271962.blog.51cto.com/10261962/1699471