2010-10-20 97 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); 
}