2010-10-20 134 views
2

在這段代碼中,ident和data變量在回調中是正確的,但我不知道如何在每個循環迭代中傳遞正確的i。我試着閱讀函數並嘗試了10件事情,但唉,我必須尋求堆棧的智慧。另一個javascript函數範圍問題

function callback() 
{ 
    $(ident).html(data.fields[i].value); 
    $(ident).fadeTo('slow',1); 
} 

for(i=0;i<data.fields.length;i++) 
{ 
    ident='#'+data.rID+'_'+data.fields[i].field; 
    $(ident).fadeTo('slow',0,callback); 
} 

回答

4

改變你的 「回調」 功能:

function callback(i) { 
    return function() { 
    $(ident).html(data.fields[i].value); 
    $(ident).fadeTo('slow',1); 
    }; 
} 

然後在您的循環:

$(ident).fadeTo('slow',0,callback(i)); 

這個 「回調」 實施回報,你會傳遞函數「fadeTo() 」。

+0

需要在循環中使'ident'變量本地化,以保持正確的引用..或在回調中將其更改爲'$(this)' – 2010-10-20 14:19:25

+0

我不確定您的意思是Gaby,解決方案是否工作寫得很好^^ – Matt 2010-10-20 14:25:31

+0

從發佈的代碼看來,「ident」是全球性的,或者至少是相對全球性的。它當然可以像「數據」一樣傳遞給函數。 – Pointy 2010-10-20 14:32:10

-1

您可以使用匿名函數代替指針callback,這樣就可以在i傳遞給callback

function callback(i, elem) 
{ 
    $(elem).html(data.fields[i].value); 
    $(elem).fadeTo('slow',1); 
} 

for(i=0;i<data.fields.length;i++) 
{ 
    var ident='#'+data.rID+'_'+data.fields[i].field; 
    $(ident).fadeTo('slow',0,function() { callback(i, this); }); 
} 

而不是使ident一個全局變量,這將是最好聲明它(使其限制在當前函數的範圍內),然後使用this在回調來引用該元素。

如果你不使用callback其他地方,它可能是有意義的只是把它實現匿名函數的內部,而不是單獨定義它並呼喚它:

for(i=0;i<data.fields.length;i++) 
{ 
    ident='#'+data.rID+'_'+data.fields[i].field; 
    $(ident).fadeTo('slow',0,function() { 
     $(ident).html(data.fields[i].value); 
     $(ident).fadeTo('slow',1); 
    }); 
} 

的上面的內聯匿名函數示例不起作用,因爲在回調之間共享對i的引用。

+1

這是行不通的。該函數的每個實例最終會引用相同的「i」值(即「data.fields.length」)。 – Pointy 2010-10-20 14:06:45

+1

這兩個例子都是錯誤的..第一個是因爲回調仍然引用全局'ident'變量和參數'i'將會是相同的。第二個'i'和'ident'在回調中會出錯.. – 2010-10-20 14:16:05

+0

感謝您的反饋。內聯的例子肯定是錯誤的(需要像@Pointy一樣做,並使用一個新的函數給'i'一個不同的範圍)。我已經更新了另一個,以使'ident'不是全局變量,而是將其更改爲從回調中使用'this'。 – bdukes 2010-10-20 15:41:16

0

一種方法是在for循環中聲明回調函數。

0

我的原始答案不正確。感謝@Pointy的提醒。

這與@ Pointy的答案類似,但是對於閉包有不同的位置。

function callback(k) { 
    $(this).html(data.fields[k].value); 
    $(this).fadeTo('slow',1); 
} 

for(i=0;i<data.fields.length;i++) { 
    (function(j) { 
      ident='#'+data.rID+'_'+data.fields[j].field; 
      $(ident).fadeTo('slow',0, function() { callback.call(this, j) }); 
    })(i); 
}