При работе с javascript вы, должно быть, сталкивались с этим жаргоном и, возможно, задавались вопросом, что это на самом деле означает. Итак, позвольте мне попытаться упростить это для вас.
Оператор функции (также известный как объявление функции) и выражение функции — это одно и то же, за исключением очень сложной детали.
Позвольте мне пояснить на примере.
function statement() { console.log("This is a statement"); }
Это оператор функции. Это в основном то, как вы определяете свои функции в своем коде. Ничего нового.
Теперь давайте сделаем это немного по-другому.
var expression = function() { console.log("This is an expression"); }
Теперь это функциональное выражение. Как видите, единственная разница здесь в том, что эта функция создается как анонимная функция и присваивается переменной.
Это не обязательно должна быть анонимная функция, но может быть и именованная функция.
var expression = function named() { console.log("This is an expression"); }
Теперь давайте попробуем оценить эти два подхода для создания функции.
function statement() { console.log("This is a statement"); } var expression = function() { console.log("This is an expression"); } statement(); expression();
Выход:
This is a statement This is an expression
Ничего удивительного. Как вы и ожидали. 😬
Теперь давайте попробуем вызвать эти функции до того, как они будут созданы. Как вы, наверное, догадались, эти функции должны быть подняты при создании памяти, и это должно работать без сбоев, да?
statement(); expression(); function statement() { console.log("This is a statement"); } var expression = function() { console.log("This is an expression"); }
Но нет. 😑 Посмотрите на результат этого.
This is a statement Uncaught TypeError: expression is not a function
Странно, верно? 🤨 Не совсем так.
Во время подъема обе эти функции получают выделенную им память, но только функция, объявленная с помощью операторов function, назначается этой памяти. Функция, созданная с помощью выражений, ведет себя как обычная переменная. Как вы, наверное, знаете, переменным присваивается неопределенное начальное значение во время подъема, а реальное значение присваивается только при выполнении кода. Поэтому, если вы попытаетесь вызвать функцию, созданную с помощью функциональных выражений, до ее создания, вы получите ошибку.
Подводя итог, можно сказать, что единственная разница между оператором функции и выражением функции заключается в подъеме.
Спасибо за прочтение!