Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.01.2012, 12:34
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

Таймеры: "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м примером?

Последний раз редактировалось jsuse, 08.01.2012 в 13:16.
Ответить с цитированием
  #2 (permalink)  
Старый 08.01.2012, 12:42
Интересующийся
Отправить личное сообщение для Saqsess Посмотреть профиль Найти все сообщения от Saqsess
 
Регистрация: 06.01.2012
Сообщений: 25

В последнем варианте скобочка потеряна?
setTimeout(sayHi("Вася"), 1000);   // Привет, я Вася

В данном случает setTimeout не срабатывает, т.е. эта строка идентична:
sayHi("Вася");
Ответить с цитированием
  #3 (permalink)  
Старый 08.01.2012, 13:21
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

Сообщение от Saqsess Посмотреть сообщение
В последнем варианте скобочка потеряна?
setTimeout(sayHi("Вася"), 1000);   // Привет, я Вася

В данном случает setTimeout не срабатывает, т.е. эта строка идентична:
sayHi("Вася");
Уже исправил.
Ответить с цитированием
  #4 (permalink)  
Старый 08.01.2012, 13:21
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

Все, разобрался. В 3м примере он просто вызывает функцию. Он не делает задержку. Оборачивать в функцию нужно, чтоб срабатывала задержка.
Ответить с цитированием
  #5 (permalink)  
Старый 08.01.2012, 16:50
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

[quote=jsuse]Да, так передает. Но он прекрасно передает и так:

function sayHi(who) {
  alert("Привет, я " + who);
}

setTimeout(sayHi("Вася"), 1000);   // Привет, я Вася


разжую:

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

setTimeout( function(a){} ,2000), то в a он мог бы что-то засовывать. какую то служебную информацию. но он этого не делает.
То есть вызывая функцию, он бы передавал в неё что-то. Какую-то свою инфу. Но он этого не делает.

Последний раз редактировалось Livaanderiamarum, 08.01.2012 в 16:53.
Ответить с цитированием
  #6 (permalink)  
Старый 08.01.2012, 16:56
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от jsuse Посмотреть сообщение
Все, разобрался. В 3м примере он просто вызывает функцию. Он не делает задержку. Оборачивать в функцию нужно, чтоб срабатывала задержка.
че за хуйню ты несешь)?
он принимает функцию))

var q = function(){}


q() - ЭТО ВЫЗОВ ФУНКЦИИ то есть там лежит не функция а результат её работы. то что после return в ней
q - А ЭТО это САМА функция.

ИНЫМИ СЛОВАМИ КРУГЛЕНЬКИЕ СКОБОЧКИ () ЭТО ОПЕРАТОР КОТОРЫЙ ВЫПОЛНЯЕТ ФУНКЦИЮ КОТОРАЯ СЛЕВА ОТ НЕГО


setTimeout принимает функцию и число.
setTimeout(q, 200) // понятно? нахуя нам передавать РЕЗУЛЬТАТ РАБОТЫ функции ВЫПОЛНЯЯ ЕЁ ПИША ПОСЛЕ НЕЁ СКОБОЧКИ ВЫЗОВА))??? Нужно передавать просто функцию, ПЕРЕМЕННУЮ В КОТОРОЙ ОНА ЛЕЖИТ.
а setTimeout сам скобочками её вызовет по истечении таймера.

а если передавать анонимную функцию, мы же её не вызываем передавая))?
а мы могли бы это сделать так ( function(){})() взяв её в скобки группровки и применить к ним оператор вызова.
но мы передает не РЕЗУЛЬТАТ РАБОТЫ а чисто текст функции)) которую он вызывет скобочками сам потом когда таймер пройдет, а до тех пор будет хранить у ся в памяти


setTimeout( function(){} , 200)

Последний раз редактировалось Livaanderiamarum, 08.01.2012 в 17:04.
Ответить с цитированием
  #7 (permalink)  
Старый 09.01.2012, 17:57
Интересующийся
Отправить личное сообщение для vandy3 Посмотреть профиль Найти все сообщения от vandy3
 
Регистрация: 28.10.2010
Сообщений: 14

Ну все правильно человек написал, что если написать, так как он написал в последнем примере, то функция вызовется сразу, а не сработает таймер.
В setTimeout передается ссылка на функцию, которую надо выполнить по истечение таймера. То есть либо можно послать имя функции, либо через переменную, либо создав анонимную функцию, в которой уже будет твоя функция с параметром.
var q = function(){}; // причем можно и на уже существующую функцию сделать ссылку
setTimeout( myFunc, 1000 );
setTimeout( q, 1000 );
setTimeout( function(){ myFunc('vasya'); }, 1000 ); // через анонимную функцию, здесь происходит объявление функции, без выполнения.


Причем в setTimeout ещё же первым параметром можно строчку передать, тогда можно и параметры передавать:
setTimeout( "myFunc('vasya')", 1000 );

В последнем не уверен на 100%, но по-моему правда.
Ответить с цитированием
  #8 (permalink)  
Старый 09.01.2012, 18:15
Интересующийся
Отправить личное сообщение для Saqsess Посмотреть профиль Найти все сообщения от Saqsess
 
Регистрация: 06.01.2012
Сообщений: 25

Последний пример не сработает.
Ответить с цитированием
  #9 (permalink)  
Старый 09.01.2012, 18:40
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,078

Сообщение от Saqsess
Последний пример не сработает.

function myFunc(name)
{
  alert(name);
}
setTimeout( "myFunc('vasya')", 1000 );
Ответить с цитированием
  #10 (permalink)  
Старый 09.01.2012, 19:03
Интересующийся
Отправить личное сообщение для Saqsess Посмотреть профиль Найти все сообщения от Saqsess
 
Регистрация: 06.01.2012
Сообщений: 25

Черт. В свою защиту скажу, что проверял на jsfiddle.net - там не срабатывает, а в консоли chrome все отлично работает. Был не прав.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск