2010-11-17 61 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

相關問題