JavaScript

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

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

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

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

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

Необходимость "присвоения" ФВ переменной - только в повышении читаемости кода, и стабильности расхода ресурсов: например, если создавать ФВ в цикле, то жор памяти и процессорного времени зависит только от оптимизатора (сообразит ли он создать в куче лишь один экземпляр вместо нескольких одинаковых)... а если до цикла объявить переменную с референсом из ФВ, и использовать ее в цикле, то это гарантирует создание лишь одного экземпляра функции.
Юрий Лисовский
Юрий Лисовский
87 078
Андрей Пак Ничего не забыл? Перечитай повнимательнее.
Александр Завхоз таки V8 больше других движков использует отложенную JIT компиляцию. т. е. любая функция не будет скомпилирована пока явно не будет использована в выражении либо же браузер заверещит все свои текущие задачи и начнет выполнять задачи из 4й очереди.
Ситуация становится еще интереснее когда начинают срабатывать тригеры на оптимизацию.
приходит турбофан и начинает тварить оптимизацию.
как переменной, ну например каллбек-функцию передать параметром в другую функцию

и еще это чуть выразительнее смотрится, если функцию объявляешь внутри другой функции. обычно там объявляешь переменные и это тоже переменная
>> Зачем в JavaSript function declaration и function expression?
Для удобства. Не обязательно сначала создавать функции а после их использовать.
Можно прямо на месте по мере необходимости создавать и использовать функции.

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