Settimeout

Тема в разделе "HTML, CSS, XML, JavaScript", создана пользователем Vadik(R), 25 май 2008.

  1. Vadik(R)

    Vadik(R) Well-Known Member

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

    Vovochka Гость

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

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    А, короче говоря, параметр, передаваемый в setTimeout не может быть локальной функцией.
    Ну ладно, впринципе, моему скрипту от этого хуже не станет, просто было интересно.
    Хотя вот здесь мне дали другой ответ, но все равно спасибо! :)
     
  4. Vovochka

    Vovochka Гость

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

    garrymax Гость

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

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

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

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

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

    Так что первый ответ от Vovochka более правильный.
     

Поделиться этой страницей