Источник: http://learn.javascript.ru/function-declaration-expression
При объявлении функции создаётся переменная со значением-функцией. В частности, невозможно иметь функцию и переменную с одинаковым именем.Функции, объявленные как Function Declaration, создаются интерпретатором до выполнения кода.
Пример объявления Function Declaration:
sayHi("Вася");
function sayHi(name) {
alert("Привет, " + name);
}
Условно объявить функцию через Function Declaration нельзя.
Функцию можно создать и присвоить переменной как самое обычное значение. Такое объявление называется Function Expression и выглядит так:
var sayHi = function(person) {
alert("Привет, " + person);
};
sayHi('Вася'); // Привет, Вася
var arr = [1, 2, function(a) { alert(a) }, 3, 4];
var fun = arr[2];
fun(1); // 1
В отличие от объявлений Function Declaration, которые создаются заранее, до выполнения кода, объявления Function Expression создают функцию, когда до них доходит выполнение. Благодаря этому свойству Function Expression можно (и даже нужно) использовать для условного объявления функции.
Такая функция объявляется — и тут же вызывается, вот так:
(function() {
var a = 1, b = 2; // переменные для нашего скрипта
// код скрипта
})();
Задача такой функции обёртки — создать отдельную область видимости для скрипта.
Скобки нужны, чтобы показать, что у нас Function Expression, который по правилам JavaScript можно вызвать «на месте». Скобки не нужны, если это и так Function Expression, например в таком вызове:
// функция объявлена и тут же вызвана
var res = function(a,b) { return a+b }(2,2);
alert(res); // 4
Но при вызове «на месте» лучше ставить скобки и для Expression.
Функция здесь создаётся как часть выражения присваивания, поэтому является Function Expression и может быть вызвана «на месте». При этом, так как сама функция нигде не сохраняется, то она исчезнет, выполнившись, останется только её результат.
Функции в JavaScript являются значениями. Их можно присваивать, передавать, создавать в любом месте кода.
Между этими двумя основными способами создания функций есть следующие различия:
| | Function Declaration | Function Expression | || -------------------- | ------------------- | | Время создания | До выполнения первой строчки кода | Когда управление достигает строки с функцией | | Можно вызвать до объявления | Да (т.к. создается заранее) | Нет | | Можно объявить в if | Нет (т.к. создается заранее) | Да | | Можно вызывать «на месте» | Нет (ограничение синтаксиса JavaScript) | Да |
Используйте Function Expression только там, где это действительно нужно. Например, для объявления функции в зависимости от условий.