Функции в Javascript: ссылки и вызовы
Если для вас до сих пор остаётся тайной различие между строками a = myFunc()
и a = myFunc
, то эта статья для вас.
Начну с того, что объясню различие между этими двумя строками.
a = myFunc(); //переменной a присваивается результат выполнения функции myFunc() a = myFunc; //переменной a присваивается ссылка на функцию myFunc
Важно понимать, что в первом случае значение функции будет вычислено сразу, как только интерпретатор дойдёт до этой строки, в то время как во втором случае никакого расчёта значения функции не происходит.
С непониманием этого связано множество характерных ошибок:
- -й неверный скрипт:
function hello() { alert('Hello, world!'); } document.onclick = hello();
В результате интерпретатор сразу выполнит функцию
hello()
и присвоит свойствуdocument.onclick
значениеundefined
, потому что функция ничего не возвращает.
Для правильной работы скрипта нужно присвоить свойствуdocument.onclick
ссылку на функцию:
document.onclick = hello;
Теперь функцияhello()
будет выполнятся каждый раз при клике по документу. - -й неверный скрипт:
function message(text) { alert(text); } document.onclick = message('Hello, world!');
В этом скрипте была произведена попытка описать обработку события вызовом функции с параметром. Результат работы скрипта аналогичен первому. Правильный вариант следующий:
document.onclick = function() { message('Hello, world!'); };</code>
- -й неверный скрипт:
[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>
- -й неверный скрипт:
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);