2009-12-04 40 views
4

前段時間我發佈了一個關於what questions should a good javascript coder be able to answer的問題。 Meder指出以下問題:如何在JavaScript中複製參考值?

由於「i」在onclick函數中作爲參考而不是作爲參考值存在,因此以下代碼會將任何「a」元素點擊爲alert(-1) :

<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> 

的問題是:如何使的onclick 功能擁有i的值修正這個 實現的,不能 它的參考?

我不知道答案。如何解決它?如何讓我成爲參考價值的副本而不是實際參考?

小問題:所有變量類型都作爲參考傳入嗎?或者它是否是原始類型還是對象?

任何想法將不勝感激。

+0

這是最常見的問題之一,請查看我的回答和在這個問題中的評論:http://stackoverflow.com/questions/1804438/#1804452 – CMS 2009-12-04 01:24:06

回答

3

要理解這個問題,您必須瞭解什麼是封閉是。然後你還必須知道javascript如何處理範圍(它是基於函數的,而不是像C那樣以塊爲基礎)。

這裏的「stantard」的解決方案:

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

另一個版本,做正是同樣的事情,但可能會更容易理解,如果你不習慣在JS關閉和範圍是:

for (var i = as.length; i--;) { 
    as[i].onclick = (function(number) { 
     return function() { 
      alert(number); 
      return false; 
     } 
    })(i); 

有想法嗎?

+0

明白了!謝謝! – 2009-12-04 15:17:06

1
<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() { 
     return function() { 
      alert(i); 
      return false; 
     } 
    }(); 
} 
</script> 

也許?

+1

你幾乎*那裏...提示:你有通過將它作爲參數傳遞給自我執行函數來捕獲'i'變量... – CMS 2009-12-04 01:28:16