为了账号安全,请及时绑定邮箱和手机立即绑定

正在回答

2 回答

不明觉厉


0 回复 有任何疑惑可以回复我~

这涉及到javascript中闭包,作用域,引用的概念。

// 这段代码是错误的

// 每个星星节点的点击事件

for(var i=0;i<5;i++){

  stars[i].onclick=function(){

    getStar(i);

  }

}


当前作用域总是能够访问外部作用域中的变量。

onclick函数总是能够访问到 window.onload 函数作用域中的变量i,

但是onclick函数没有复制这个变量,只是引用了。


onload函数执行完后,其中的变量i没有销毁,因为onclick函数引用了,

但是这个时候循环已经执行完毕,i的值变成了5。


当onclick函数触发执行时,获取变量i的值时,自然取到的是5,而不是星星对应的序号。



解决办法:复制一份。

// 每个星星节点的点击事件

for(var i=0;i<5;i++){

!function(index) {

stars[index].onclick=function(){

getStar(index);

}

}(i);

}


利用自执行函数,将i作为参数传入,index成为i的拷贝。

再把index放入onclick函数中即可。


更多关于闭包和作用域的知识,可参考javascript秘密花园文档:

http://www.jb51.net/onlineread/JavaScript-Garden-CN/#function.closures


1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信