javascript閉包傳參和事件的循環綁定示例探討

今天看到一個javascript的題目,按常理循環綁定事件,但是得到的結果卻不是想要的。 

<a href="#">text</a> 
<br> 
<a href="#">link</a> 
<script> 
var as = document.getElementsByTagName('a'); 
for ( var i = as.length; i--; ) { 
    as[i].onclick = function() {
        alert(i);
        return false;
    }
}
</script>

1.這個代碼點擊鏈接彈出的i都是-1,這是爲啥呢? 

簡單來說就是函數變量作用域問題,如果把function() { alert(i); return false; } 當做一個函數 a();a()內部未定義變量i,但是內部使用了,於是向外查找,找到for循環裏定義的i,點擊事件是for循環完畢後纔開始執行的,執行完畢後i的值已經變成-1;所以每次彈出的都是-1; 

2. 2個參數的for循環也不常見!疑惑? 

  for(語句1,語句2,語句3){ 

    //todo 

  } 

a.for循環條件 

通常說語句1、語句2、語句3都是可選的。 

b.語句 2: 

  通常語句 2 用於評估初始變量的條件。 

  語句 2 同樣是可選的。 

  如果語句 2 返回 true,則循環再次開始,如果返回 false,則循環將結束。 

  提示:如果您省略了語句 2,那麼必須在循環內提供 break。否則循環就無法停下來。這樣有可能令瀏覽器崩潰。 

c.關於 i--判斷: 

  判斷i--true /false的時候是先判斷i再運算i--的。進入最後一次判斷 i--的時候其實判斷 i==0的時候,判斷後又執行了一次i--,for循環終止, 於是i的值變成了-1; 

  var i = 1; 

  !!i--;//ture 

解決方法: 

加一層閉包,i以局部變量形式傳遞給內存函數 !

function init4() { 
var pAry = document.getElementsByTagName("p"); 
for( var i=0; i<pAry.length; i++ ) { 
 (function () { 
    var temp = i;//調用時局部變量 
    pAry[i].onclick = function() { 
        alert(temp); 
    } 
  })(); 
} 
}




發佈了97 篇原創文章 · 獲贊 183 · 訪問量 86萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章