jQuery

Правило работы функции setTimeout

Чем данная запись timer[i] = setTimeout(function() {document.getElementById("PopMenu" + i).style.display = "none"}, 300);
Отличается от timer[i] = setTimeout(document.getElementById("PopMenu" + i).style.display = "none", 300);
Почему нельзя просто написать как на второй записи? Если написать как на второй, то задержка в 300 не работает
setTimeout - функция, и она требует другую функцию в виде первого аргумента.

setTimeout(document.getElementById("PopMenu" + i).style.display = "none", 300);

при вызове функции сначала выполняется инструкция

document.getElementById("PopMenu" + i).style.display = "none"

Она возвращает строку "none" и получается то же самое, что

document.getElementById("PopMenu" + i).style.display = "none";
setTimeout("none", 300);

У setTimeout осталась возможность выполнять строку кода (которую не надо использовать), и это фактически выполняется как

setTimeout(function() {
  "none";
}, 300);

Создается строка, и ничо не происходит)
Сергей Козлов
Сергей Козлов
62 360
Лучший ответ
Контекстом выполнения
Эй
Эй
59 848
>> Почему нельзя просто написать как на второй записи?
Разве кто то запрещает тебе так писать? Бери и пиши просто написанный код не будет работать как ты ожидаешь.

>> Если написать как на второй, то задержка в 300 не работает
Это ошибочное мнение. Задержка сработает и setTimeout вызовет то что ей передали в первом параметре.

От сюда можно сделать выводы что в твоих ожиданиях (суждениях) есть ошибка осталось ее найти и не повторять в будущем.

Есть функция setTimeout() она может принимать два параметра.
Параметры должны иметь какой то тип и какое то значение.
В обоих случаях вместо конкретного параметра ты используешь выражение.
Выражение не может быть параметром для функции по этому интерпретатор исполняет это выражение и возвращает результат как параметр в функцию.

В первом случае выражение вернет объект типа function.
Во втором случае выражение вернет объект типа undifined.
Затем происходит вызов функции setTimeout c полученными параметрами.

Во втором случае достаточно заменить выражение на строку строка это уже конкретный параметр который может принять функция setTimeout
т. е.
setTimeout( "document.getElementById(/"PopMenu/" +" +i+ ").style.display = /"none/"", 300);

Стоит обратить внимание на то что строки не создают замыкания в отличии от функциональных выражений по этому в них нельзя использовать переменные из внешнего окружения.
Артём Юхно
Артём Юхно
12 592
Потому что первое в setTimeout должна быть функция, вторая аргумент, можешь сделать через var fun = function(){};