49. Объявление функции.

Функция – блок кода, который определяется один раз и может выполняться (вызываться) многократно.

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

В JavaScript любая функция:

Два основных способа определения функции: инструкция объявления функции или выражение определения функции.

// инструкция
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; }

Общая структура:

Имя функции:

Обычное соглашение об именовании: 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 объявлять функции с одним именем, последнее объявление перекрывает все предыдущие: