Одна из вещей, о которой довольно часто спрашивают на собеседованиях - это разница между двумя способами написания функции: между выражением функции (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;
};
Какой способ использовать?
Какой из способов вы выберете, почти полностью зависит от вашего вкуса. Для единства кода, предпочтительней выбрать один стиль написания функций и придерживаться его на протяжении всего сценария.
Если вам нужно вызвать функцию до ее объявления, тогда, конечно, используйте объявления функций.
Однако многие предпочитают функциональные выражения и широко используют их во всем своем коде. Причина - они усиливают структуру кода.
С помощью функциональных выражений нельзя вызвать функцию, пока ее не выразили, поэтому код будет иметь красивую и аккуратную структуру. Функции, вызывающие другие функции, должны будут записываться в определенном порядке, иначе они не будут работать. И тогда весь код будет отрабатывать в конце файла.
Чтение кода - важная вещь, но, опять же, это полностью личное предпочтение, каким способом писать функции. И тот и другой сработают ладно.
Комментарии (0)