Еще один вопрос о сфере действия функции JavaScript - PullRequest
2 голосов
/ 20 октября 2010

В этом коде переменные identifier и 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 ]

4 голосов
/ 20 октября 2010

Измените свою функцию «обратного вызова»:

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

Затем в цикле:

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

Эта реализация «обратного вызова» возвращает функцию, которую вы 'перейду к "fadeTo ()".

0 голосов
/ 20 октября 2010

Мой первоначальный ответ был неверным.Спасибо @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);
}
0 голосов
/ 20 октября 2010

Один из способов - объявить функцию обратного вызова в цикле for.

0 голосов
/ 20 октября 2010

Вы можете использовать анонимную функцию вместо указателя на 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 где-либо еще, возможно, имеет смысл просто поместить ее реализацию в анонимную функцию, а не определять ее отдельно и вызывать ее:

<del>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);
    });
}
</del>

Приведенный выше пример со встроенной анонимной функцией не работает, поскольку ссылка на i является общей для обратных вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...