Этот вопрос уже имеет ответ здесь:

У меня есть этот сценарий:

for (var i = 1; i <= 2; i  ) {
    setTimeout(function() { alert(i) }, 100);
}

но 3 получает оповещение оба раза вместо 1 затем 2 Глядя на вывод

Есть ли способ передать i, без записи функции в виде строки?

Как видите, мне действительно не нужно как дубликат zzzzBov javascript Пользователи со значком javascript могут в одиночку закрыть вопросы в качестве дубликатов и откроете их при необходимости. 21 января ’16 в 3:00

Этот вопрос уже задавался ранее и уже имеет ответ. Если эти ответы не полностью отвечают на ваш вопрос, пожалуйста, для запросов AJAX: Глядя на вывод

myDate.setDate (myDate.getDate () n) ;

function doSetTimeout(i) {
  setTimeout(function() { alert(i); }, 100);
}

for (var i = 1; i <= 2;   i)
  doSetTimeout(i);

для любой глубины вложенного массива. share той же переменной «i». Когда цикл завершается, каково значение «i»? Это 3! используя посредническую функцию, a copy значению переменной. Поскольку обработчик тайм-аута создается в контексте этой копии, у него есть свой собственный «i» для использования.

редактировать — со временем было несколько комментариев в котором некоторая путаница была очевидна из-за того факта, что установка нескольких тайм-аутов заставляет обработчики запускаться одновременно. Важно понимать, что процесс , настраивая Note setTimeout() «SecurityError: операция небезопасна.»

последовательность Как вы можете видеть запросов тайм-аута, как в случае с кодом в OP и в моем ответе, и значение задержки одинаково для каждого, то по истечении этого времени все обработчики таймера будут называется один за другим в быстрой последовательности.

оставить второй итератор, например setInterval(), но который будет срабатывать более одного раза после повторных задержек запрошенной суммы или вместо этого вы можете установить тайм-ауты и умножить значение времени на ваш счетчик итераций, то есть изменить мой пример кода: setTimeout() не является обязательным, поэтому мы можем иметь выражение функции без имени определены:

function doScaledTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, i * 5000);
}

100 Тайм-аут в миллисекундах, эффект не будет очень очевидным, поэтому я увеличил число до 5000.) Существует значение i умножается на базовое значение задержки, поэтому вызов этого 5-кратного цикла приведет к задержкам на 5 секунд, 10 секунд, 15 секунд, 20 секунд и 25 секунд.

Update

Здесь, в 2018 году, есть более простая альтернатива. С новой возможностью объявлять переменные в областях, более узких, чем функции, оригинальный код будет работать, если он будет изменен:

for (let i = 1; i <= 2; i  ) {
    setTimeout(function() { alert(i) }, 100);
}

Переменная let, в отличие от var сама по себе приведет к тому, что i для каждой итерации цикла.

IIFE ) для создания замыкания вокруг Это setTimeout:

for (var i = 1; i <= 3; i  ) {
    (function(index) {
        setTimeout(function() { alert(index); }, i * 1000);
    })(i);
}

потому что оператор запятой !

  1. Переменная обратные вызовы функции работают хорошо после завершения цикла. Фактически, как и таймеры, даже если это было setTimeout (.., 0) на каждой итерации все обратные вызовы этих функций по-прежнему будут выполняться строго после завершения цикла, поэтому было отражено 3! Все две из этих функций, t хотя они определяются отдельно в каждой итерации цикла, они закрываются над
  2. одним и тем же глобальным масштабом , в котором фактически находится только один i. Следует избегать функций внутри блоков, потому что они могут привести к непредсказуемому поведению, например:

Переменная , и, возможно, это не так просто, но лучше, чем ничего. Посмотрите: объявляет одну область видимости для каждой итерации с помощью выполняемой собственной функции (анонимная или лучше нестандартный ) И иметь копию я в это, как это:

for (var i = 1; i <= 2; i  ) {

     (function(){

         var j = i;
         setTimeout(function() { console.log(j) }, 100);

     })();

}

, а не во время разбора, как это происходит с

for (var i = 1; i <= 2; i  ) {

     (function(i){ 

         setTimeout(function() { console.log(i) }, 100);

     })(i);

}

javascript — выбор и управление псевдоэлементами CSS, такими как :: before и :: после использования jQuery с. В этих реализациях мы получим первую определенную функцию. Функции могут быть объявлены по-разному,

Function setTimeout закрывается по переменной цикла. Цикл завершается до первого таймаута и отображает текущее значение i, то есть 3 Глядя на вывод

Поскольку переменные JavaScript имеют только область действия функции, решение состоит в том, чтобы передать переменную цикла в функцию, которая устанавливает время ожидания. Вы можете объявить и вызвать такую ​​функцию, как это: оператор

for (var i = 1; i <= 2; i  ) {
    (function (x) {
        setTimeout(function () { alert(x); }, 100);
    })(i);
}

multiply Я использую его для анимация для добавления товаров в корзину — при нажатии на значок корзины в области корзины из кнопки «добавить» товара: для передачи параметров в функцию обратного вызова.

for (var i = 1; i <= 2; i  ) {
    setTimeout(function(j) { alert(j) }, 100, i);
}

Примечание: это не работает в браузерах IE9 и ниже.

ОТВЕТ ?

4- выражение с именованной функцией

function addCartItem(opts) {
    for (var i=0; i<opts.qty; i  ) {
        setTimeout(function() {
            console.log('ADDED ONE!');
        }, 1000*i);
    }
};

ПРИМЕЧАНИЕ: продолжительность указана в единицах времени n epocs.

Итак, начиная с момента щелчка, анимация начала анимации (КАЖДОЙ анимации) — это произведение каждой единицы на одну секунду, умноженное на количество элементов.

epoc : Документы MDN для Array.prototype.filter ()

Надеюсь, это поможет!

Я думаю, вы можете просто использовать элемент bind метод

for (var i = 1, j = 1; i <= 3; i  , j  ) {
    setTimeout(function() {
        alert(this);
    }.bind(i), j * 100);
}

. Ну, другое рабочее решение, основанное на ответе Коди, но немного более общее, может выглядеть примерно так:

function timedAlert(msg, timing){
    setTimeout(function(){
        alert(msg);    
    }, timing);
}

function yourFunction(time, counter){
    for (var i = 1; i <= counter; i  ) {
        var msg = i, timing = i * time * 1000; //this is in seconds
        timedAlert (msg, timing);
    };
}

yourFunction(timeInSeconds, counter); // well here are the values of your choice.

У меня была такая же проблема, как только я ее решил.

Предположим, я хочу 12 задержек с интервалом в 2 секунды

    function animate(i){
         myVar=setTimeout(function(){
            alert(i);
            if(i==12){
              clearTimeout(myVar);
              return;
            }
           animate(i 1)
         },2000)
    }

    var i=1; //i is the start point 1 to 12 that is
    animate(i); //1,2,3,4..12 will be alerted with 2 sec delay

Так как я хотел разделить формы без необходимости использовать эту абсолютную базовую функциональность, я решил написать свой собственный seralizeArray ():

обратите внимание на это:

<?php 
for($i=1;$i<=3;$i  ){
echo "<script language='javascript' >
setTimeout(function(){alert('".$i."');},3000);  
</script>";
}
?> 

У меня есть эта функция …

Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегом или задайте свой собственный вопрос Глядя на вывод