Я изучаю JavaScript и недавно узнал о событиях JavaScript. Когда я узнал о setTimeout в W3Schools , я заметил странную фигуру, с которой раньше не сталкивался. Они используют двойные кавычки и затем вызывают функцию.

Пример:

setTimeout("alertMsg()", 3000);

Я знаю эти двойные и одинарные кавычки в JavaScript означают строку.

Также я увидел, что могу сделать то же самое:

setTimeout(alertMsg, 3000);

С круглыми скобками, на которые он ссылается, без скобок, которые он скопировал. Когда я использую цитаты и скобки, это становится сумасшедшим.

Я буду рад, если кто-нибудь сможет объяснить мне разницу между этими тремя способами использования setTimeout:

с круглыми скобками:

setTimeout("alertMsg()", 3000);

Без кавычек и круглых скобок:

setTimeout(alertMsg, 3000);

А третий использует только кавычки: { *} Примечание: лучшим источником для ссылки

setTimeout("alertMsg", 3000);

будет setTimeout. Вы должны передать ссылку на функцию в качестве первого аргумента для MDN Глядя на вывод

массивов setInterval или setTimeout

. Эта ссылка может иметь вид: setTimeout или setInterval Анонимная функция

  • Обратите внимание, что я устанавливаю «переменную в функции» отдельно от «имени функции». Не очевидно, что имена переменных и функций занимают одно и то же пространство имен и могут заглушить друг друга.

    setTimeout(function(){/* Look mah! No name! */},2000);
    
  • Имя существующей функции

    function foo(){...}
    
    setTimeout(foo, 2000);
    
  • Переменная, которая указывает на существующую функцию

    var foo = function(){...};
    
    setTimeout(foo, 2000);
    

    Передача аргументов

Чтобы вызвать функцию и передать параметры, вы можете вызвать функцию внутри обратного вызова, назначенного таймеру:

Существует другой метод для передачи аргументов в обработчик, однако

setTimeout(function(){
  foo(arg1, arg2, ...argN);
}, 1000);

это не так кросс-браузерный совместимый контекст обратного вызова Глядя на вывод

setTimeout(foo, 2000, arg1, arg2, ...argN);

Контекст обратного вызова

По умолчанию контекст обратного вызова (значение this внутри функции, вызываемой таймером) при выполнении является глобальным объектом window. Если вы хотите изменить его, используйте bind Глядя на вывод

setTimeout(function(){
  this === YOUR_CONTEXT; // true
}.bind(YOUR_CONTEXT), 2000);

выделенная библиотека

Хотя это возможно, вы не должны передавать строку setTimeout или setInterval. Передача строки заставляет setTimeout() или setInterval() использовать функциональность, аналогичную eval() AJAX (XMLHttpRequest) , выполняет строки как сценарии CSS

Я думаю, что функция setTimeout, которую вы пишете, не запускается. Если вы используете jquery, вы можете заставить ее работать правильно, выполнив это:

    function alertMsg() {
      //your func
    }

    $(document).ready(function() {
       setTimeout(alertMsg,3000); 
       // the function you called by setTimeout must not be a string.
    });

Полностью согласен с Иосифом.

Вот скрипка, чтобы проверить это: http://jsfiddle.net/nicocube/63s2s/

В контексте скрипты строковый аргумент не работает, по моему мнению, потому что функция не определено в глобальной области.

Что происходит в действительности, если вы передаете строку в качестве первого параметра функции

setTimeout ('string', number С чем вы столкнулись

— это значение первого параметра, полученного во время выполнения (после number пройденных миллисекунд). В основном он равен

setTimeout (eval('string'), number С чем вы столкнулись

Это

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

Таким образом, примеры, на которые вы ссылаетесь, не являются хорошими образцами и могут быть заданы в другом контексте или просто опечаткой.

Если вы вызываете так setTimeout(something, number), первый параметр — это не строка, а указатель на нечто, называемое something. И снова, если something — строка — тогда она будет оценена. Но если это функция, то функция будет выполнена. Jsbin sample

с круглыми скобками:

setTimeout("alertMsg()", 3000); // It work, here it treat as a function

Без кавычек и круглых скобок:

setTimeout(alertMsg, 3000); // It also work, here it treat as a function

А третий использует только кавычки: { *} Примечание: лучшим источником для ссылки

setTimeout("alertMsg", 3000); // It not work, here it treat as a string
function alertMsg1() {
        alert("message 1");
    }
    function alertMsg2() {
        alert("message 2");
    }
    function alertMsg3() {
        alert("message 3");
    }
    function alertMsg4() {
        alert("message 4");
    }

    // this work after 2 second
    setTimeout(alertMsg1, 2000);

    // This work immediately
    setTimeout(alertMsg2(), 4000);

    // this fail
    setTimeout('alertMsg3', 6000);

    // this work after 8second
    setTimeout('alertMsg4()', 8000);

В приведенном выше примере первый вызов функции alertMsg2 () немедленно (мы даем время 4S, но это не беспокоит) после того, что alertMsg1 () (время ожидания 2 секунды), затем alertMsg4 () (время ожидания 8 Se cond), но alertMsg3 () не работает, потому что мы помещаем его в кавычки без сторон, поэтому он рассматривается как строка.