НОВИНКА!
Занимательная математика от Трепачёва. Присоединяйтесь к нам!
⊗jsPmFTFENIn 233 of 505 menu

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

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

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

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

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

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

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

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

Можно также, к примеру, передать функцию в качестве параметра в 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('!'); } );
Русский
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить