Функции

Два факта в JS делают функции такими интересными:

  • Функции являются объектами первого класса
  • Функции обеспечивают область видимости

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

// именованное функциональное выражение
var add = function add(a, b) {
return a + b;
};

// функциональное выражение, так же известное как анонимная функция
var add = function (a, b) {
return a + b;
};

// декларация
function foo() {
// тело функции
}

Так как функции это объекты первого класса, их можно передавать как аргументы, возвращать, а так же присваивать переменным и добавлять к ним свойства:

// функциональное выражение (анонимная функция),
// передается как аргумент функции `callMe`
callMe(function () {//я функциональное выражение});

// именованное функциональное выражение
callMe(function me() {//я именованное функциональное выражение});

// другое функциональное выражение
var myobject = {
say: function () {//и я функциональное выражение}
};

function foo() {} // декларация
var bar = function () {}; // выражение
var baz = function baz() {}; // именованное выражение
foo.name; // "foo"
bar.name; // ""
baz.name; // "baz"

Функции создают собственные области видимости:

// глобальная область
function foo() {}

function local() {
// локальная область
function bar() {}
return bar;
}

Технически возможно использовать именованное функциональное выражение и присвоить его переменной, чье имя отличается от имени функционального выражения:

var foo = function bar() {};

Но тем не менее, в некоторых браузерах (например, IE) это вызовет неправильное поведение, по этому не рекомендуется использовать данный паттерн.

Источник – книга «JavaScript Patterns», Stoyan Stefanov
Редактировать на GitHub