2014-02-12 2 views
0

Ниже мой Javascript код:Как передать значение из цикла для SetTimeout функции

function showBranch_init() { 
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"]; 
    for(a=0;a<id_arr.length;a++){ 
     timeoutID = window.setTimeout(function() { 

      showBranch(id_arr[a]); // <-- Right here 

     }, 500); 
    } 
} 

Как я могу передать значение id_arr[a] в showBranch несильны?

В настоящее время выше код возвращает null для id_arr[a]

+0

Мой вопрос a является глобальной переменной? –

+0

Неверно, 'a == id_arr.length - 1' для всех тайм-аутов. – RobH

+0

Но в чем причина тайм-аутов в любом случае? Они будут исполняться одновременно. –

ответ

6

путем введения новой области (при вызове функции) для каждой итерации вы можете передать аргумент так:

function showBranch_init() { 
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"]; 
    for(a=0;a<id_arr.length;a++){ 
     (function(i) { 
      timeoutID = window.setTimeout(function() { 
       showBranch(id_arr[i]); // <-- Right here 
      }, 500*i); 
     })(a); 
    } 
} 
  • Обновлено в заполнить 2-й запрос: showBranch() с шагом 500 мс.
+2

Пожалуйста, не используйте термин «закрытие» для описания такого решения. Обратный вызов, переданный 'setTimeout', является * уже * закрытием. Фактическое решение состоит в том, чтобы создать новую область, выполнив функцию, а не создав еще одно закрытие. Является ли выполняемая функция закрытием или нет, не имеет к ней никакого отношения. –

+2

+1, но определите функцию вне цикла for, потому что она создает один ** каждый раз ** вы итерации – axelduch

-1
function showBranch_init() { 
var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"]; 

    timeoutID = window.setTimeout(function() { 
     for(a=0;a<id_arr.length;a++){ 
     showBranch(id_arr[a]); // <-- Right here 
     } 
    }, 500); 
} 

Вы можете это сделать ?? О_О

0

http://jsfiddle.net/HXc4d/

function showBranch_init() { 
    var id_arr = ["jdc_b1","jdc_b2","jdc_b3","jdc_b4"]; 
    for(a=0;a<id_arr.length;a++){ 
     timeoutID = window.setTimeout(function(idvalue) { 
      showBranch(idvalue); 
     }(id_arr[a]), 500); 
    } 
} 

EDIT: Проблема с вашим решением является то, что, когда код выполняется (тайм-аут) id_arr больше не существует в исполняющем объеме, что приводит к undefined результату. При отправке переменной в качестве аргумента она «остается» с самой функцией, независимо от области выполнения.

+0

Не могли бы вы ** объяснить ** свое решение, а не просто отправлять код? Что не так с кодом OP? –

Смежные вопросы