又一个javascript函数范围问题

时间:2010-10-20 13:59:25

标签: javascript scope

在这段代码中,ident和data变量在回调中是正确的,但我不知道如何为每次循环迭代传递正确的i。我已经尝试过读取函数并尝试了10件事,但是,我必须寻求堆栈的智慧。

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 个答案:

答案 0 :(得分:4)

更改“回拨”功能:

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

然后在你的循环中:

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

这个“回调”实现返回你将传递给“fadeTo()”的函数。

答案 1 :(得分:0)

一种方法是在for循环中声明回调函数。

答案 2 :(得分: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);
}

答案 3 :(得分:-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来引用该元素。 / p>

如果你没有在其他任何地方使用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的引用在回调之间共享。