亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 1926 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號