传递对象作为参数的Javascript

问题描述:

我得到这个传递对象作为参数的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

您的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的值。

您想为创建一个闭包,当前的值为_person。但是你需要一个可以立即评估的函数。

您的绑定语句中的函数仅在点击事件发生时被评估。

@Darko Z的代码是一个很好的如何解决的例子。