2010-06-11 121 views
13
for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, function() 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

如何將somearray或其索引之一傳遞給匿名函數? 是的someArray已經在全球範圍內,但我仍然得到的someArray [i]是未定義JavaScript的參數匿名函數

+0

這是一個共同的問題 - 查看所有相關的問題的http://計算器。 com/questions/tagged/javascript + closures + loops – Anurag 2010-06-11 18:49:08

回答

29

在匿名功能i捕獲可變i,而不是它的。在循環結束時,i等於somearray.length,因此當您調用函數時,它會嘗試訪問不存在的元素數組。

您可以通過一個函數,構造函數捕獲變量的值解決這個問題:

function makeFunc(j) { return function() { console.log(somearray[j][0]); } } 

for (var i = 0; i < somearray.length; i++) 
{ 
    myclass.foo({'arg1':somearray[i][0]}, makeFunc(i)); 
} 

makeFunc的爭論可能會被命名爲i,但我把它叫做j表明它是一個不同的變量比在循環中使用的還要多。

+0

+1對問題給出了很好的解釋,並提供了一個解決方案! – Matt 2010-06-11 15:19:41

+0

我明白了你的觀點。謝謝。但我只是不知道如何調用makeFunc。 – Phonethics 2010-06-11 18:16:19

+0

太棒了!我解決了我的問題。這對於我來說在JavaScript中完全是一件新事物! – Phonethics 2010-06-12 03:45:20

-2

所有函數/方法可以作爲唯一的回調。當你調用回調函數時,你將變量傳遞給它。

var myclass = { 
    foo: function(params, callback){ 
    // do some stuff 
    callback(variable1, variable1, variableN); 
    } 
} 
9

怎麼樣關閉:

for (var i = 0; i < somearray.length; i++) { 
    var val = somearray[i][0]; 
    myclass.foo({'arg1': val}, function(v) { 
     return function() {console.log(v) }; 
    }(val)); 
} 
0
for (var i = 0; i < somearray.length; i++) 

{ 
    myclass.foo({'arg1':somearray[i][0]}, function(somearray) 
    { 
     console.log(somearray[i][0]); 
    }); 
} 

然後用PARAM foo方法調用匿名函數。