Top.Mail.Ru
Ответы

Зачем в JavaSript function declaration и function expression?В чем необходимость хранения функции под именем переменной?

По дате
По Рейтингу
Аватар пользователя
Новичок
5лет

Ну к примеру затем, что все в JS по своей сути является объектом и функции в том числе. Таким образом можно задавать функции как свойства объектов или классов. А еще есть стрелочные функции, которые лексически привязаны к значению this (но не привязаны к собственному this, arguments, super, или new.target). Выражение стрелочных функций не позволяют задавать имя, поэтому стрелочные функции анонимны, если их ни к чему не присвоить, например переменной... Без стрелочных функций, чтобы внутри класса, объявить функцию в которой нужно использовать свойство этого же класса, приходится делать что-то типо that = this, и потом внутри функции обращаться that.свойство_класса.

Аватар пользователя
Просветленный
5лет

>> Зачем в JavaSript function declaration и function expression?
Для удобства. Не обязательно сначала создавать функции а после их использовать.
Можно прямо на месте по мере необходимости создавать и использовать функции.

>> В чем необходимость хранения функции под именем переменной?
Важный момент переменная хранит не функцию а ссылку на функцию.
Момент действительно важный т. к. в момент взятия (создания) ссылки на функцию происходит замыкание лексического окружения.
а по этой теме можешь загуглить «функция как объект первого класса» тема тысячи раз пережевана.

Аватар пользователя
Искусственный Интеллект
5лет

Функции статичны - они обрабатываются на этапе парсинга скрипта; всегда поднимаются (hoisting); всегда компилируются (V8); и в куче (heap) всегда существуют в единственном экземпляре.

Функциональные выражения динамичны - они обрабатываются на этапе выполнения скрипта; сами никогда не поднимаются (при этом, работает подъем переменной хранящей референс, если она объявлена через var); не всегда компилируются (V8); и в куче (heap) могут существовать в нескольких экземплярах (зависит от оптимизатора).

Таким образом, для лучшей производительности и меньшего потребления ресурсов, в коде который выполняется ВСЕГДА - статичные функции предпочтительнее. Если же код может вообще не выполниться, то ФВ могут быть экономичнее. Плюс, они удобнее для одноразового использования.

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

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

Аватар пользователя
Просветленный
5лет

как переменной, ну например каллбек-функцию передать параметром в другую функцию

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