如何将变量传递给闭包

时间:2014-03-31 14:43:52

标签: javascript api closures

我正在使用Decarta JS API PIN事件处理程序

我正在地图上显示引脚,并且每个引脚的click事件都会正确触发。当我尝试将pin id传递给处理程序时,会出现问题。无论点击哪个引脚,它始终显示最后加载的ID。我声明监听器的代码是:

for (var idx = 0; idx < jsonObjects.devices.length; idx++) {
    var device = jsonObjects.devices[idx]
    deCarta.Core.EventManager.listen('click', function() {home.pinPushed(device.id);}, device.pin);
}

这是在我正在显示的所有位置的循环中完成的。它们在各自的坐标处正确显示,并且记录前一行清楚地显示每个引脚都使用正确的id进行声明。但是,每当我点击一个引脚时,声明的 LAST id 是唯一传递给处理程序的id:

home.pinPushed(device.id)

如何在单击引脚时让每个引脚传递唯一ID?

1 个答案:

答案 0 :(得分:1)

试试这个:

deCarta.Core.EventManager.listen('click', 
 (function(id) { return  function (){home.pinPushed(id);}})(device.id), device.pin);

美化版:

 deCarta.Core.EventManager.listen('click', (function (id)
 {
     return function ()
     {
         home.pinPushed(id); //<---- id here is the closured variable
     }
 })(device.id), device.pin);

说明:

Js有一个函数范围(不是大括号({})范围。)

您的for循环创建 ANY 范围/功能。

我正在做的是为每次迭代创建执行上下文。

对于每次迭代,我将当前device.id发送给一个函数,该函数又返回另一个函数,该函数关闭了该变量。