# Нюансы функциональных выражений в JavaScript

Название Function Expression (функциональное выражение) дано не просто так. Оно действительно означает это - то, что такие функции являются частью какого-либо выражения.

Например, мы можем сложить какую-нибудь строку и безымянную функцию:

`let str = 'str' + function() {return 3;}; console.log(str); // выведет 'strfunction() {return 3;}'`

Почему мы видим такой странный результат, а не число `3`? Потому что второе слагаемое - это не результат работы функции, а ее исходный код (ведь мы эту функцию не вызвали, а просто написали).

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

Присваивание к переменной тоже выражение:

`let func = function() { console.log('!'); };`

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

`console.log(function() {return 3;});`

Почему это важно: потому что отличие Function Declaration и Function Expression совсем не в том, что первая функция создается с именем, а вторая изначально имени не имеет. Это не так.

Пример. Вот у нас функция без имени, но при этом не участвует ни в каком выражении (то есть с ней не совершается никаких действий, говоря по-простому):

`/* Данная функция будет Function Declaration, но с синтаксической ошибкой: */ function() { console.log('!'); }`

Такой код вообще выдаст ошибку! Почему: так как функция не участвует ни в каком выражении, то браузер считает ее Function Declaration, но не находит ее имени и выдает ошибку.

Чтобы ошибка исчезла, нужно заставить функцию стать частью какого-либо выражения. Например, напишем перед ней операцию `+`:

`+function() { // такой код корректен console.log('!'); };`

Как это работает: сама по себе операция `+` ничего не делает, это все равно как написать вместо числа `3` число `+3` - допустимо, но ничего не меняет.

Но в случае с функцией - меняет. Теперь наша функция уже не просто написана, а участвует в выражении. Поэтому ошибки теперь не будет. Результата выполнения функции тоже не будет, ведь мы ее просто написали, но не вызвали.

Вместо `+` можно написать все, что угодно. Например:

`-function() { // такой код корректен console.log('!'); }; !function() { // такой код корректен console.log('!'); };`

Можно также взять нашу функцию в круглые скобки, в этом случае она также станет функциональным выражением:

`(function() { // такой код корректен console.log('!'); });`

Определите, является ли представленная функция Function Declaration или Function Expression:

`function func() { console.log('!'); }`

Определите, является ли представленная функция Function Declaration или Function Expression:

`let func = function() { console.log('!'); }`

Определите, является ли представленная функция Function Declaration или Function Expression:

`+function() { console.log('!'); }`

Определите, является ли представленная функция Function Declaration или Function Expression:

`!function func() { console.log('!'); }`

Определите, является ли представленная функция Function Declaration или Function Expression:

`-function func() { console.log('!'); }`

Определите, является ли представленная функция Function Declaration или Function Expression:

`1 + function func() { console.log('!'); }`

Определите, является ли представленная функция Function Declaration или Function Expression:

`(function func() { console.log('!'); })`

Определите, является ли представленная функция Function Declaration или Function Expression:

`console.log( function() { console.log('!'); } );`
← →
↑
en ru