在Javascript中将对象作为参数传递

时间:2012-02-13 03:40:31

标签: 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或另一个li元素时它会警告列表中的姓氏嵌套在ul中。例如:

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

当我在保罗点击时,我希望显示“你已点击保罗”的警报,而我总是在列表中得到最后一个:“你点击了Bonnie”。如何获得所选li的正确提醒?

2 个答案:

答案 0 :(得分: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 :(得分:1)

您想为_person当前值创建一个闭包。但是你需要一个能够立即对其进行评估的函数。

只有在发生click事件时才会评估bind语句中的函数。

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