Таймеры: "setTimeout" и "setInterval"
Вопрос по уроку "Таймеры: "setTimeout" и "setInterval".
Вот здесь автор пишет, что "по умолчанию, setTimeout не передаёт функции никаких аргументов". И приводит пример: function sayHi(who) { alert("Привет, я " + who); } setTimeout(sayHi, 1000); // Привет, я undefined Все вроде правильно, не передает. Потому что ничего и не передавалось. Потом он пишет такое: "Для того, чтобы аргументы передать, обёртывают вызов в анонимную функцию:" function sayHi(who) { alert("Привет, я " + who); } setTimeout(function() { sayHi('Вася') }, 1000); // Привет, я Вася Да, так передает. Но он прекрасно передает и так: function sayHi(who) { alert("Привет, я " + who); } setTimeout(sayHi("Вася"), 1000); // Привет, я Вася То есть очевидно, что по умолчанию setTimeout преспокойно может передавать функции аргументы. Вопрос. Зачем автор пишет, что setTimeout не может? Или здесь есть какие особенные различия между 2м и 3м примером? |
В последнем варианте скобочка потеряна?
setTimeout(sayHi("Вася"), 1000); // Привет, я Вася В данном случает setTimeout не срабатывает, т.е. эта строка идентична: sayHi("Вася"); |
Цитата:
|
Все, разобрался. В 3м примере он просто вызывает функцию. Он не делает задержку. Оборачивать в функцию нужно, чтоб срабатывала задержка.
|
[quote=jsuse]Да, так передает. Но он прекрасно передает и так:
function sayHi(who) { alert("Привет, я " + who); } setTimeout(sayHi("Вася"), 1000); // Привет, я Вася разжую: дело в том что 'Вася' передает не функция setTimeout, а человек написавший скрипт. setTimeout, например, мог бы передавать свой айдишник, или время вызова и время старта, то есть если написать в нем setTimeout( function(a){} ,2000), то в a он мог бы что-то засовывать. какую то служебную информацию. но он этого не делает. То есть вызывая функцию, он бы передавал в неё что-то. Какую-то свою инфу. Но он этого не делает. |
Цитата:
он принимает функцию)) var q = function(){} q() - ЭТО ВЫЗОВ ФУНКЦИИ то есть там лежит не функция а результат её работы. то что после return в ней q - А ЭТО это САМА функция. ИНЫМИ СЛОВАМИ КРУГЛЕНЬКИЕ СКОБОЧКИ () ЭТО ОПЕРАТОР КОТОРЫЙ ВЫПОЛНЯЕТ ФУНКЦИЮ КОТОРАЯ СЛЕВА ОТ НЕГО setTimeout принимает функцию и число. setTimeout(q, 200) // понятно? нахуя нам передавать РЕЗУЛЬТАТ РАБОТЫ функции ВЫПОЛНЯЯ ЕЁ ПИША ПОСЛЕ НЕЁ СКОБОЧКИ ВЫЗОВА))??? Нужно передавать просто функцию, ПЕРЕМЕННУЮ В КОТОРОЙ ОНА ЛЕЖИТ. а setTimeout сам скобочками её вызовет по истечении таймера. а если передавать анонимную функцию, мы же её не вызываем передавая))? а мы могли бы это сделать так ( function(){})() взяв её в скобки группровки и применить к ним оператор вызова. но мы передает не РЕЗУЛЬТАТ РАБОТЫ а чисто текст функции)) которую он вызывет скобочками сам потом когда таймер пройдет, а до тех пор будет хранить у ся в памяти setTimeout( function(){} , 200) |
Ну все правильно человек написал, что если написать, так как он написал в последнем примере, то функция вызовется сразу, а не сработает таймер.
В setTimeout передается ссылка на функцию, которую надо выполнить по истечение таймера. То есть либо можно послать имя функции, либо через переменную, либо создав анонимную функцию, в которой уже будет твоя функция с параметром. var q = function(){}; // причем можно и на уже существующую функцию сделать ссылку setTimeout( myFunc, 1000 ); setTimeout( q, 1000 ); setTimeout( function(){ myFunc('vasya'); }, 1000 ); // через анонимную функцию, здесь происходит объявление функции, без выполнения. Причем в setTimeout ещё же первым параметром можно строчку передать, тогда можно и параметры передавать: setTimeout( "myFunc('vasya')", 1000 ); В последнем не уверен на 100%, но по-моему правда. |
Последний пример не сработает. :)
|
Цитата:
function myFunc(name) { alert(name); } setTimeout( "myFunc('vasya')", 1000 ); |
Черт. В свою защиту скажу, что проверял на jsfiddle.net - там не срабатывает, а в консоли chrome все отлично работает. Был не прав.
|
Часовой пояс GMT +3, время: 09:41. |