我明白了
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);
};
Everytime 会将 Person 对象中创建的最后一个对象传递给 onPersonChanged
函数,因此如果我单击第一个 li
或另一个,它会提醒列表中的姓氏li
元素嵌套在 ul
中。例如:
<ul class='v_list'>
<li>James</li>
<li>Paul</li>
<li>Bonnie</l>
</ul>
当我单击 Paul 时,我希望出现一条警报,显示“您已单击 Paul”,而不是我总是得到列表中的最后一个 li:“您已单击 Bonnie”。如何获得所选 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 的值。
关于javascript - 在 Javascript 中将对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255296/