Хотя другие уже рассмотрели эту тему выше, и window.setTimeout (), и window.setInterval () требуют, чтобы функция ссылалась на . Вместо этого ваш код предоставляет возвращаемое значение из вызова функции .
Когда вы хотите вызвать или вызвать функцию JavaScript, вы пишете, как и ожидалось:
DoMyfunction ();
Движок JavaScript выполнит эту функцию при обнаружении этой строки.
Однако, что требуют setTimeout () и setInterval (), это ссылка на функциональный объект , соответствующий вашей функции. Которые вы получаете с помощью следующих и аналогичных средств:
myFunc = DoMyFunction;
Эта строка копирует ссылку на функциональный объект , соответствующий DoMyFunction (), в новую переменную. Который вы можете затем передать setInterval () и setTimeout (), а именно:
discard = window.setTimeout (myFunc, 1000);
Эта строка выше будет указывать движку JavaScript на выполнение заданной функции (а именно DoMyFunction ()) один раз по истечении 1 секунды и:
discard = window.setInterval (myFunc, 1000);
заставит механизм JavaScript выполнять заданную функцию несколько раз, каждую секунду.
Конечно, вы можете достичь того же эффекта без использования новой переменной, просто так:
discard = window.setTimeout (DoMyFunction, 1000);
и т.д.
Если, однако, вы допустили ошибку при использовании:
discard = window.setTimeout (DoMyFunction (), 1000);
вместо этого происходит то, что DoMyFunction () выполняется, и любой возвращаемый параметр, возникающий из этого, равен , затем передается в функцию window.setTimeout (). Так как window.setTimeout () ожидает, что здесь будет передана ссылка на объект функции, и вместо этого получит все, что возвращает ваша функция (или undefined , если ваша функция ничего не возвращает), тогда внутренняя проверка выполняется setTimeout () ( и setInterval ()) покажет, что он не получил здесь ссылку на объект функции, и просто молча прервет работу.
Конечно, гораздо более коварная ошибка может возникнуть, если DoMyFunction () на самом деле действительно возвращает действительный объект функции! Если вы написали DoMyFunction () для этого, тогда этот функциональный объект будет вместо этого передан setTimeout (), а будет запущена функция ! Конечно, вы можете использовать это намеренно и написать свою DoMyFunction () как замыкание, возвращая фактическую функцию, которую вы хотите, чтобы setTimeout () выполняла как возвращаемый параметр объекта функции, и если вы используете что подход, то форма:
discard = window.setTimeout (DoMyFunction (), 1000);
больше не будет ошибочным.
Помните, что каждая функция JavaScript, которую вы пишете в своем коде, когда этот код анализируется, связана с функциональным объектом механизмом JavaScript. Для выполнения функции используйте:
DoMyFunction ();
Для ссылки на функциональный объект вместо этого используйте:
DoMyFunction;
Те () могут сделать огромную разницу в зависимости от контекста, в результате JavaScript использует этот подход для различия между ссылкой на объект функции и функцией инструкция по исполнению .