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

js中onclick的存在的问题?

js中onclick的存在的问题?

1. var Nav = document.getElementById('nav').getElementsByTagName('li');      for (var i = 0; i < Nav.length; i++) {          Nav[i].onclick = function (event) {              alert(i);          }      }2. for (var i = 0; i <6; i++) {          alert(i);   }为什么我第一个js中点击一个按钮 然后打印出i的值  为什么i的值一直打印出来的值是5;不应该像2这样从1到5一个个打印出来吗?
查看完整描述

2 回答

?
Judy_1024

TA贡献4条经验 获得超1个赞

闭包:

for (var i = 0; i < Nav.length; i++) {
	(function(index){
		Nav[i].onclick = function (event) {
			alert(index);
		}
	})(i)
}

绑到属性上

for (var i = 0; i < Nav.length; i++) {
	Nav[i].index=i;
	Nav[i].onclick = function (event) {
		alert(this.index);
	}
}

以下两点大白话可以帮助你理解:

  1. 每循环一次,可以理解为代码复制一份;

  2. 函数执行的时候函数内参数才会被赋给实际的值。

以你写的代码1为例:

i=0时:

Nav[0].onclick = function (event) {
	alert(i);
}

i=1时:

Nav[1].onclick = function (event) {
	alert(i);
}

……

当点击时,函数执行,为i赋值,此时作用域内i=Nav.length,所以弹出的都是Nav.length。

查看完整回答
1 反对 回复 2016-08-24
?
Caballarii

TA贡献1123条经验 获得超629个赞

代码绑定的时候i是从1到5的,但是当onclick执行的时候,是执行function(event){alert(i)}这段代码,此时的i已经执行完循环以后的值了,所以是5

查看完整回答
反对 回复 2016-08-24
  • weibo_张张张张张大仙呀_03578611
    weibo_张张张张张大仙呀_03578611
    那我应该怎么才能答应出当前的i值?请指教,谢谢
  • Caballarii
    Caballarii
    两种方法,把i保存到运行时能取到的地方去,比如把i保存到Nav[i]这个元素的属性上,然后在onclick的时候也去取这个属性。另一种方法就是使用闭包
  • 2 回答
  • 1 关注
  • 1778 浏览
慕课专栏
更多

添加回答

举报

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