Одна из вещей, о которой довольно часто спрашивают на собеседованиях - это разница между двумя способами написания функции: между выражением функции (function expression) и объявлением функции (function declaration).

// Объявление функции
function add(num1, num2) {
  return num1 + num2;
}

// Выражение функции
var add = function (num1, num2) {
  return num1 + num2;
};

Первый пример, function add() {}, называется объявлением функции. Второй пример, var add = function() {}, называется выражением функции (или функциональным выражением).

Они более-менее делают одно и то же, но между ними есть одно тонкое, но важное различие.

Хоистинг

Когда загружается файл JavaScript (или документ HTML с JavaScript в нем), объявления функций поднимаются браузером в верхнюю часть кода до того, как любой код будет выполнен (это и есть процесс хоистинг).

Что именно это значит?

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

/* Так функция отработает */
function add(num1, num2) {
  return num1 + num2;
}
add(3, 3);  // => 6


/* Но и так тоже отработает */
substract(7, 4);  // => 3
function subtract(num1, num2) {
  return num1 - num2;
}

Однако, выражения функции так не поднимаются. Если вы попытаетесь запустить функцию до того, как ее выразили, вы получите сообщение об ошибке.

/* Так функция отработает */
var add = function(num1, num2) {
  return num1 + num2;
};
add(3, 3);  // => 6


/* А вот так уже нет */
substract(7, 4);  // => Uncaught TypeError: subtract is not a function
var subtract = function (num1, num2) {
  return num1 - num2;
};

Какой способ использовать?

Какой из способов вы выберете, почти полностью зависит от вашего вкуса. Для единства кода, предпочтительней выбрать один стиль написания функций и придерживаться его на протяжении всего сценария.

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

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

С помощью функциональных выражений нельзя вызвать функцию, пока ее не выразили, поэтому код будет иметь красивую и аккуратную структуру. Функции, вызывающие другие функции, должны будут записываться в определенном порядке, иначе они не будут работать. И тогда весь код будет отрабатывать в конце файла.

Чтение кода - важная вещь, но, опять же, это полностью личное предпочтение, каким способом писать функции. И тот и другой сработают ладно.