Функции в 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);