Функции в Javascript: ссылки и вызовы

29 октября 2009 г.

Если для вас до сих пор остаётся тайной различие между строками a = myFunc() и a = myFunc, то эта статья для вас.
Начну с того, что объясню различие между этими двумя строками.

a = myFunc(); //переменной a присваивается результат выполнения функции myFunc()
a = myFunc; //переменной a присваивается ссылка на функцию myFunc

Важно понимать, что в первом случае значение функции будет вычислено сразу, как только интерпретатор дойдёт до этой строки, в то время как во втором случае никакого расчёта значения функции не происходит.
С непониманием этого связано множество характерных ошибок:

  1. -й неверный скрипт:
    function hello() {
    alert('Hello, world!');
    }
    document.onclick = hello();
    

    В результате интерпретатор сразу выполнит функцию hello() и присвоит свойству document.onclick значение undefined, потому что функция ничего не возвращает.
    Для правильной работы скрипта нужно присвоить свойству document.onclick ссылку на функцию:
    document.onclick = hello;
    Теперь функция hello() будет выполнятся каждый раз при клике по документу.

  2. -й неверный скрипт:
    function message(text) {
    alert(text);
    }
    document.onclick = message('Hello, world!');
    

    В этом скрипте была произведена попытка описать обработку события вызовом функции с параметром. Результат работы скрипта аналогичен первому. Правильный вариант следующий:

    document.onclick = function() { message('Hello, world!'); };</code>
  3. -й неверный скрипт:
    [span onclick='noBubble(e);']Hello, world![/span]
    <script>
    function noBubble(e) {
    e.stopPropagation();
    }
    </script>

    Здесь была предпринята попытка обработать ссылку на событие e, передаваемую в обработчик (в IE такого нет). Такой вариант обречён на неудачу, так как атрибуту onclick присваивается вызов функции noBubble(), а не ссылка на эту функцию. Правильным будет следующий скрипт:

    [span id='mySpan']Hello world![/span]
    <script>
    document.getElementById('mySpan').onclick = function(e) {
    e.stopPropagation();
    }
    </script>
  4. -й неверный скрипт:
    function hello() {
    alert('Hello, world!');
    }
    setTimeout(hello, 5000);

    Этой ошибке может способствовать привычка создавать ссылки на функции. Однако, нужно помнить, что в функции setTimeout() и setInterval() первым параметром следует передавать строку кода вызова функции:

    function hello() {
    alert('Hello, world!');
    }
    setTimeout("hello()", 5000);

    Напоследок напомню об одной замечательной возможности Javascript: передача ссылки на функцию в качестве аргумента другой функции:

    function greeting(func) {
    func('Hello, world!');
    }
    greeting(alert);
    greeting(confirm);
    greeting(prompt);
Теги: рубрика JavaScript
  • Похожие статьи
  • Предыдущие из рубрики