Конспект JS-course

Function Declaration и Function Expression

Источник: http://learn.javascript.ru/function-declaration-expression

При объявлении функции создаётся переменная со значением-функцией. В частности, невозможно иметь функцию и переменную с одинаковым именем.

Время создания Function Declaration

Функции, объявленные как Function Declaration, создаются интерпретатором до выполнения кода.

Пример объявления Function Declaration:

sayHi("Вася");

function sayHi(name) {
  alert("Привет, " + name);
}

Условно объявить функцию через Function Declaration нельзя.

Объявление Function Expression

Функцию можно создать и присвоить переменной как самое обычное значение. Такое объявление называется 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 в основном потоке кода - он считает, что это Function Declaration.
  • Если же function идёт в составе более сложного выражения, то он считает, что это Function Expression.

Скобки нужны, чтобы показать, что у нас 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.

Между этими двумя основными способами создания функций есть следующие различия:

| | Function Declaration | Function Expression | || -------------------- | ------------------- | | Время создания | До выполнения первой строчки кода | Когда управление достигает строки с функцией | | Можно вызвать до объявления | Да (т.к. создается заранее) | Нет | | Можно объявить в if | Нет (т.к. создается заранее) | Да | | Можно вызывать «на месте» | Нет (ограничение синтаксиса JavaScript) | Да |

Используйте Function Expression только там, где это действительно нужно. Например, для объявления функции в зависимости от условий.