传递对象作为参数的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
的正确警报?
答
您的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的代码是一个很好的如何解决的例子。
这是什么问题? – 2012-02-13 03:42:34
我认为他有一个关闭问题.... – 2012-02-13 03:43:16