2012-02-13 194 views
0

我得到這個傳遞對象作爲參數的Javascript

for(m in _data.data) 
    { 
     var _person= new Person(_data.data[m].Properties); //return a person object 
     $('ul.v_list').append("<li>"+_person.person_name+'</li>').css("cursor", "pointer"); 

     $('ul.v_list').find('li:last').bind('click', function(){onPersonChanged(_person)}); 
    } 

而這另一個功能

function onPersonChanged(person){ 
     alert("You have clicked " + person.person_name); 
    }; 

每次被傳遞Person對象創建的最後一個對象到onPersonChanged功能,所以它提醒最後如果我點擊第一個li或嵌套在ul中的另一個li元素,則可以列表中的名稱。例如:

<ul class='v_list'> 
    <li>James</li> 
    <li>Paul</li> 
    <li>Bonnie</l> 
</ul> 

當我在做保羅點擊我希望顯示「您單擊保羅」,而不是我總是在列表中的最後一個禮警告:「你已經點擊邦尼」。我如何獲得所選li的正確警報?

+1

這是什麼問題? – 2012-02-13 03:42:34

+0

我認爲他有一個關閉問題.... – 2012-02-13 03:43:16

回答

1

您的onPersonChanged函數在循環執行後被調用,因此循環中只有最後一個_person會被傳遞。在javascript中查找「閉包」。

要解決它,你應該做到以下幾點:

for(m in _data.data) 
{ 
    var _person= new Person(_data.data[m].Properties); 
    (function(p) { 
     $('ul.v_list').append("<li>"+p.person_name+'</li>').css("cursor", "pointer"); 

     $('ul.v_list').find('li:last').bind('click', function(){onPersonChanged(p)}); 

    })(_person); 
} 

,因爲它是在迴路中的那一點,而不是評估其循環完成後,這將評估_person當前值。

(function(p) { ... })(_person);是一個匿名自我執行功能。這會在for循環中創建一個新的子範圍,這將正確保留_person的值。

1

您想爲創建一個閉包,當前的值爲_person。但是你需要一個可以立即評估的函數。

您的綁定語句中的函數僅在點擊事件發生時被評估。

@Darko Z的代碼是一個很好的如何解決的例子。

相關問題