Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Settimeout
Форум программистов > Интернет и сети > Web-программирование > HTML, CSS, XML, JavaScript
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 передать внутреннюю функцию надо это как-то особо написать?
Vovochka
Ну это как смотреть через стену. Почему я не вижу что находиться за стеной?
Функция headoftable() не существует в глобальной области видимости.
Она существует лишь в области видимости функции data(). Т. е. между { и } для data();
Вы можете ей воспользоваться лишь в той же области видимости в которой объявлена функция, ну или из более углублённой.
Она локальна. Такой трюк, который вы хотите сделать, фактически не возможен.
Vadik(R)
А, короче говоря, параметр, передаваемый в setTimeout не может быть локальной функцией.
Ну ладно, впринципе, моему скрипту от этого хуже не станет, просто было интересно.
Хотя ]]>вот здесь]]> мне дали другой ответ, но все равно спасибо! smile.gif
Vovochka
На самом деле, тот человек ошибся. Замыкание было бы, если бы ты возвращал значением функцию, помнящею состояние локальных переменных.
Типа:
function get_sum_function (a, b) {
  return function () {
    return a+b;
  }
}
garrymax
Цитата(Vadik(R) @ 26:05:2008, 12:03 ) *
Хотя ]]>вот здесь]]> мне дали другой ответ
Это не правильный ответ: попробуй убрать только кавычки (скобки оставить), как там советовали и поставить немеренное время:
setTimeout(headoftable(), 1000000);
Вывод функции будет сразу после загрузки страницы. Если же убрать и кавычки, но время оставить немеренное, то работать будет как положено.

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

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

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

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

Так что первый ответ от Vovochka более правильный.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.