2010-11-17 66 views
1

昨晚,我谷歌搜索了很多,找不到解决方案,我的问题: 我有一个for循环与一个函数,它只让我从数组中的最新值。如何在JavaScript中实现这个函数的闭包?

所以,这里是例子:

obj1.route = new Routeng(); 
obj2.route = new Routeng(); 

for(var x in arrObjs) { //arrObjs = array of objects 
    var g = arrObjs[x]; 

    // I can access properties of all "g" objects 

    Routelousse.gen(function(res) { 
    var pathern = res.pathern; 
    g.routel.staviPather(pathern); 

    MYOBJ.vehicles.push(g); 
    alert(g.name); // during the loop I always get the LAST "g" object from "arrObjs" 
    }, g.point); 

} 
+0

不清楚(对我)你要求什么? – annakata 2010-11-17 10:09:00

+0

@annakata - 因为JavaScript在这里没有代码块范围,所以''''循环传递每次都使用相同的'g',所以在异步函数完成时使用不正确的代码。 – 2010-11-17 10:11:26

+0

@annakata - thanx,但尼克解决了我的问题! – 2010-11-17 10:14:30

回答

2

它应该是这样的:

obj1.route = new Routeng(); 
obj2.route = new Routeng(); 

for(var x=0; x<arrObjs.length; x++) { 
    var g = arrObjs[x]; 

    (function(ig) { 
    Routelousse.gen(function(res) { 
     var pathern = res.pathern; 
     ig.routel.staviPather(pathern); 

     MYOBJ.vehicles.push(ig); 
     alert(ig.name); 
    }, ig.point); 
    })(g); 
} 

在此我们传递当前g成自动执行功能不同的变量,而不是g,它在您当前正在使用的函数中共享(这不是块范围),并且正在更改for循环的每次通过。

还要注意for循环改变的......你永远不应该使用for...in循环来迭代阵列,使用普通的for环路这一点。

+0

THANX !!这个伎俩,帮助我很多! – 2010-11-17 10:12:14

+0

@达科 - 欢迎! – 2010-11-17 10:20:49

相关问题