日期:2014-05-16  浏览次数:20490 次

JS参数传递的问题

请看下面代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>js參數傳遞問題</title>
<script type="text/javascript">
var $ = function (id) {
    return "string" == typeof id ? document.getElementById(id) : id;
};
function addEventHandler(oTarget, sEventType, fnHandler) {
	if (oTarget.addEventListener) {
		oTarget.addEventListener(sEventType, fnHandler, false);
	} else if (oTarget.attachEvent) {
		oTarget.attachEvent("on" + sEventType, fnHandler);
	} else {
		oTarget["on" + sEventType] = fnHandler;
	}
};
</script>

<style type="text/css">
#idGlideView div{width:500px;height:50px;}
</style>
</head>
<body>
<div id="idGlideView">
  <div style="background-color:#006699;"> <a href="/">1111111</a> </div>
  <div style="background-color:#FF9933;"> <a href="/">2222222</a> </div>
  <div style="background-color:#9999FF;"> <a href="/">3333333</a> </div>
  <div style="background-color:#006699;"> <a href="/">4444444</a> </div>
  <div style="background-color:#FF9933;"> <a href="/">5555555</a> </div>
  <div style="background-color:#9999FF;"> <a href="/">6666666</a> </div>
</div>
<script type="text/javascript">
function addClickForAll(){
	var _div =  $("idGlideView");
	var _list =_div.getElementsByTagName("div");
	var _count = _list.length;
	for( var kk = 0 ; kk < _count ; kk++ ){
		addEventHandler( _list[kk],  "click" ,  function(){ alert(kk);}   );
	}
}
addClickForAll();
</script>
</body>
</html>
?

我想把点击每个层,就alert出对应的1,2,3,4,5,6

但是这样循环添加事件,alert出来的就都是6。

向大家请教下,这个参数传递过程。。

?

----------------------------------------------- 追加------------------------------

看了些文章,这样理解的
在每次for迭代的时候,这样的语句 “addEventHandler( _list[kk],? "click" ,function(){ alert(kk);}?? ); ”
中的function(){ alert(kk);}
并没有被执行,只是构建了一个函数体为”alert(kk);”的函数对象。
所以当再次调用的时候,这时的kk已经最后的一个值。

我想问,为什么这句 “alert(kk);” 就不执行?
是因为闭包的原因,这句“alert(kk);”才不执行吗?

1 楼 lyang0000 2010-05-12  
利用闭包激发作用域
2 楼 xuganggogo 2010-05-13  
楼上能说的详细点吗?
3 楼 i_love_sc 2010-05-13  
<pre name="code" class="js">addEventHandler( _list[kk],  "click" ,  function(){ alert(kk);}   ); </pre>
<p>?这里的kk始终等于kk的最终值。可以这样写</p>
<pre name="code" class="js">for( var kk = 0 ; kk &lt; _count ; kk++ ){ 
(function(k) {
addEventHandler( _list[k],  "click" ,  function(){ alert(k);}   );
})(kk)
       
}  </pre>
4 楼 xuganggogo 2010-05-13  
<div class="quote_title">i_love_sc 写道</div>
<div class="quote_div">
<pre name="code" class="js">addEventHandler( _list[kk],  "click" ,  function(){ alert(kk);}   ); </pre>
<p>?这里的kk始终等于kk的最终值。可以这样写</p>
<pre name="code" class="js">for( var kk = 0 ; kk &lt; _count ; kk++ ){ 
(function(k) {
addEventHandler( _list[k],  "cli