javascript - 在 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);
   };

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/

相关文章:

php - XFBML 和 Facebook 登录按钮

javascript - 良好的时间跨度图形表示?

javascript - 如何将数组的新属性添加到现有的 json 数据中

javascript - TypeScript 中的方法名称

javascript - 通过 JavaScript 打开一个应用程序 (iOS/Android),回退重定向到 App/Play 商店(2016 版)

javascript - angularjs 应用程序在代码连接后无法正常工作

javascript - 我们如何从 Redux - saga 中的 store.dispatch 返回一个 Promise,以便我们可以等待解析然后在 SSR 中渲染?

javascript - $viewContentLoaded 在 View 内容加载之前触发

javascript - 获取在自动完成中选择的 onSelect 中的值

javascript - 如何使用jquery显示具体的li数?