• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Settimeout

  • Автор темы Vadik(R)
  • Дата начала
V

Vadik(R)

Люди, почему функция setTimeout не может вызвать внутреннюю функцию другой функции? Если не понятен вопрос, то вот пример:
Рабочий код:
Код:
<html>
<head>
<title>страница</title>
<script language="JavaScript">
function headoftable() {
alert(1)
}
function data() {
setTimeout("headoftable()", 10)
}
</script>
</head>
<body onLoad="data()">
</body>
</html>
Не рабочий код:
Код:
<html>
<head>
<title>страница</title>
<script language="JavaScript">
function data() {
function headoftable() {
alert(1)
}
setTimeout("headoftable()", 10)
}
</script>
</head>
<body onLoad="data()">
</body>
</html>
Или чтобы в setTimeout передать внутреннюю функцию надо это как-то особо написать?
 
V

Vovochka

Ну это как смотреть через стену. Почему я не вижу что находиться за стеной?
Функция headoftable() не существует в глобальной области видимости.
Она существует лишь в области видимости функции data(). Т. е. между { и } для data();
Вы можете ей воспользоваться лишь в той же области видимости в которой объявлена функция, ну или из более углублённой.
Она локальна. Такой трюк, который вы хотите сделать, фактически не возможен.
 
V

Vadik(R)

А, короче говоря, параметр, передаваемый в setTimeout не может быть локальной функцией.
Ну ладно, впринципе, моему скрипту от этого хуже не станет, просто было интересно.
Хотя мне дали другой ответ, но все равно спасибо! :)
 
V

Vovochka

На самом деле, тот человек ошибся. Замыкание было бы, если бы ты возвращал значением функцию, помнящею состояние локальных переменных.
Типа:
Код:
function get_sum_function (a, b) {
return function () {
return a+b;
}
}
 
G

garrymax

Хотя мне дали другой ответ
Это не правильный ответ: попробуй убрать только кавычки (скобки оставить), как там советовали и поставить немеренное время:
Код:
setTimeout(headoftable(), 1000000);
Вывод функции будет сразу после загрузки страницы. Если же убрать и кавычки, но время оставить немеренное, то работать будет как положено.

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

Имя функции интерпретируется в адрес памяти, а при подставке его внутри видимости функции data это адрес есть. Через заданный интервал функция setTimeout просто передает управление по адресу, который был у нее параметром, и ее уже не "интересует" ее область видимости. По этой причине подправленный вариант на spravkaweb.ru работал - имя функции интерпретировалось в ее адрес сразу, как и выражение без кавычек.

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

Если опустить кавычки у выражения (по моем примеру в коде), то оно выполняется немедленно, а значит внутри функции, где headoftable находиться в области видимости (параметр интервала игнорируется) - просто выполняется переход по адресу функции.

Так что первый ответ от Vovochka более правильный.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!