Просто из любопытства - может кто-нибудь объяснить мне странности setTimeout ()? - PullRequest
1 голос
/ 12 февраля 2012

Под странностями я подразумеваю две вещи:

  1. Функции в первом параметре должны быть заключены в кавычки, иначе задержка будет установлена ​​на 0 (все выполняется мгновенно).
  2. Все после тайм-аута также должно иметь задержку после него, иначе оно будет выполнено до его окончания.

Если есть способ обойти # 2 - это было бы здорово, но сейчас мне просто любопытно:

Короткий фрагмент, объясняющий, о чем я говорю:

for (var i=0; i<10; i++) setTimeout("addInput('.')",i*500);
setTimeout('addInput("</br>")',5100);

В приведенном выше случае, если addInput ('.') не являетсяв кавычках задержка игнорируется, а код просто выполняется;кроме того, если я не добавлю тайм-аут во вторую строку, он будет выполнен до того, как первый тайм-аут закончится.

Ответы [ 3 ]

5 голосов
/ 12 февраля 2012

Функции в первом параметре должны быть заключены в кавычки, иначе задержка будет установлена ​​на 0 (все выполняется мгновенно).

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

for (var i=0; i<10; i++) {
    setTimeout(function() {
        addInput('.');
    }, i * 500);
}

или ее эквивалент (предупреждение: в IE не работает):

for (var i=0; i<10; i++) {
    setTimeout(addInput, i * 500, '.');
}

Чаще всего используется следующая перегрузка setTimeout :

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
4 голосов
/ 12 февраля 2012

setTimeout принимает ссылку на функцию.Это означает, что вам нужно передать ему имя функции или анонимной функции, а не результат выполнения функции.

Итак, это работает:

setTimeout(fn, 1000);

Но это не так:

setTimeout(fn(), 1000);

Второй пример немедленно выполняет fn() и передает возвращаемое значение из этой функции в setTimeout(), что обычно не то, что вы хотите (вы не получаете задержки).

Есливам нужно передать параметр в вашу функцию, затем вам нужно обернуть его в контейнерную функцию, например, так как setTimeout будет вызывать вашу функцию без параметров:

setTimeout(function() {addInput('.')}, i*500);
0 голосов
/ 12 февраля 2012
  1. Это потому, что вы сначала вызываете функцию, а затем отправляете возвращаемое значение методу setTimeout.Вы можете использовать только имя функции или, если вам нужно отправить параметры, сделать анонимную функцию:

    setTimeout (function () {addInput ('.')}, I * 500);

  2. Метод setTimeout не задерживает код, он помещает код в обратный вызов таймера.Код, следующий за вызовом setTimeout, следует немедленно.

...