49. Объявление функции.
Функция – блок кода, который определяется один раз и может выполняться (вызываться) многократно.
При определении функции можно задать параметры. При вызове функции на месте параметров указываются аргументы. Результатом вызова функции является возвращаемое значение.
В JavaScript любая функция:
- получает при вызове дополнительный аргумент – контекст вызова (внутри функции доступен через this);
- всегда возвращает некое значение;
- может выступать в качестве подпрограммы, метода объекта, конструктора объекта;
- является объектом (со всеми вытекающими последствиями).
Два основных способа определения функции: инструкция объявления функции или выражение определения функции.
// инструкция
function pointDistance(x1, y1, x2, y2) {
var dx = x2 - x1;
var dy = y2 - y1;
return Math.sqrt(dx * dx + dy * dy);
}
// выражение
var square = function(x) { return x * x; }
Общая структура:
- Ключевое слово function
- Имя функции (может отсутствовать)
- В круглых скобках список имён параметров через запятую (возможно пустой)
- В фигурных скобках тело функции (возможно пустое)
Имя функции:
- В инструкции указывать обязательно
- В выражении – опционально и доступно только внутри выражения
Обычное соглашение об именовании: lowerCamelCase (но конструкторы – с большой, а в jQuery есть $(…))
Для инструкций действует «подъём» вверх
Для определения функции можно использовать конструктор Function
, которому передают строки с именами параметров и телом функции:
var sum = new Function("x", "y", "return x + y;");
var mult = new Function("x,y", "return x * y;");
alert(sum(3, 15));
alert(mult(4, 3));
Им редко пользуются (медленный способ; ошибка в строке тела функции выдаёт SyntaxError).
Напоминание: в JavaScript именно функции определяют область видимости. Локальные переменные видны только в функции, глобальные – везде. Перефразируем: функция имеет доступ к переменными своего окружения. Причем доступ и на чтение, и на запись.
«Самоопределяемые функции»
var f = function() {
alert("A");
f = function () {
alert("B");
}
}
f(); // "A"
f(); // "B"
f(); // "B"
Функция может содержать инструкцию return
для выхода и возврата некоего значения. При этом return;
эквивалентно return undefined;
Отсутствие return можно воспринимать как return undefined;
в конце функции.
Допускается вложение определений одних функций в другие функции.
Согласно стандарту ECMAScript 5, если вложенная функция объявляется в виде инструкции, то она не может находиться внутри циклов, условных инструкций и инструкций try/catch/finally. Но не все движки следуют стандарту (точнее, почти все не следуют)! Например, V8 позволяет инструкции function находится внутри if.
Вложенная функция имеет доступ к локальным переменным обрамляющей функции.
Перегрузки функций в JavaScript нет!
Если в JavaScript объявлять функции с одним именем, последнее объявление перекрывает все предыдущие: