В JavaScript функция является значением, таким же как строка или число.
Как и любое значение, объявленную функцию можно вывести, вот так:
function sayHi() {
alert("Привет");
}
alert(sayHi); // выведет код функции
Обратим внимание на то, что в последней строке после sayHi нет скобок. То есть, функция не вызывается, а просто выводится на экран.
Функцию можно скопировать в другую переменную:
function sayHi() { // (1)
alert("Привет");
}
var func = sayHi; // (2)
func(); // Привет // (3)
sayHi = null;
sayHi(); // ошибка (4)
1. Объявление как бы говорит интерпретатору "создай функцию и помести её в переменную sayHi;
2. В строке мы копируем функцию в новую переменную func. Ещё раз обратите внимание: после sayHi нет скобок. Если бы они были, то вызов var func = sayHi() записал бы в func результатработы sayHi() (кстати, чему он равен? правильно, undefined, ведь внутри sayHi нет return).
3. На момент функцию можно вызывать и как sayHi() и как func()
4. Однако, в любой момент значение переменной можно поменять. При этом, если оно не функция, то вызов выдаст ошибку.
Обычные значения, такие как числа или строки, представляют собой данные. А функцию можно воспринимать как действие.
Это действие можно запустить через скобки (), а можно и скопировать в другую переменную, как было продемонстрировано выше.
Объявление Function Expression
Существует альтернативный синтаксис для объявления функции, который ещё более наглядно показывает, что функция – это всего лишь разновидность значения переменной.
Он называется «Function Expression » (функциональное выражение) и выглядит так:
var f = function(параметры) {
// тело функции
};
Например:
var sayHi = function(person) {
alert("Привет, " + person);
};
sayHi('Вася');
Сравнение с Function Declaration
«Классическое» объявление функции, о котором мы говорили до этого, вида function имя(параметры) {...}, называется в спецификации языка «Function Declaration ».
· Function Declaration – функция, объявленная в основном потоке кода.
· Function Expression – объявление функции в контексте какого-либо выражения, например присваивания.
Несмотря на немного разный вид, по сути две эти записи делают одно и то же:
// Function Declaration
function sum(a, b) {
return a + b;
}
// Function Expression
var sum = function(a, b) {
return a + b;
}
Оба этих объявления говорят интерпретатору: "объяви переменную sum, создай функцию с указанными параметрами и кодом и сохрани её в sum".
Основное отличие между ними: функции, объявленные как Function Declaration, создаются интерпретатором до выполнения кода.
Поэтому их можно вызвать до объявления, например:
sayHi("Вася"); // Привет, Вася
function sayHi(name) {
alert("Привет, " + name);
}
А если бы это было объявление Function Expression, то такой вызов бы не сработал:
sayHi("Вася"); // ошибка!
var sayHi = function(name) {
alert("Привет, " + name);
}
Это из-за того, что JavaScript перед запуском кода ищет в нём Function Declaration (их легко найти: они не являются частью выражений и начинаются со слова function) и обрабатывает их.
А Function Expression создаются в процессе выполнения выражения, в котором созданы, в данном случае – функция будет создана при операции присваивания sayHi = function...
Как правило, возможность Function Declaration вызвать функцию до объявления – это удобно, так как даёт больше свободы в том, как организовать свой код.
Можно расположить функции внизу, а их вызов – сверху или наоборот.
Итог по функциям
Функции в JavaScript являются значениями. Их можно присваивать, передавать, создавать в любом месте кода.
Если функция объявлена в основном потоке кода, то это Function Declaration.
Если функция создана как часть выражения, то это Function Expression.
Между этими двумя основными способами создания функций есть следующие различия:
Function Declaration | Function Expression | |
Время создания | До выполнения первой строчки кода. | Когда управление достигает строки с функцией. |
Можно вызвать до объявления | Да (т.к. создаётся заранее) | Нет |
Если нет явной причины использовать Function Expression – предпочитайте Function Declaration.
Сравните по читаемости:
// Function Expression
var f = function() {... }
// Function Declaration
function f() {... }
Function Declaration короче и лучше читается. Дополнительный бонус – такие функции можно вызывать до того, как они объявлены.
Используйте Function Expression только там, где это действительно нужно и удобно.