Как стать автором
Обновить

Комментарии 23

Основной смысл записи var f = function myFunc(){ } заключается в нормальных именах в стеке вызовов при отладке.
Что в ES6 уже не имело смысла из-за автоматического вывода имен анонимных функций из переменных и контекста объявления.
К сожалению, свойство name у анонимных функций все еще не выводится из имени переменной, только из явного объявления имени функции. Мелочь, конечно, но иногда все же неудобно.
ну пока этого никто, похоже, не реализовал :(
Да, Babel хорош :)
Ещё именованные функции распространяются на весь код сразу, а безымянные только на тот, который идёт после объявления этой функции. Тоже вполне важное отличие, но не столь существенное, согласен.
Не на весь.
Декларация функции — только на тот скоуп, в котором объявлена.
Функциональное выражение — не распространяется, по имени такая функция доступна только внутри себя (кроме ИЕ8).
Это для удобства рекурсивного вызова. По имени функция доступна внутри себя. Правда, в ИЕ8 есть проблемы — имя оказывается доступно извне.
После прочтения статьи возникло несколько вопросов и комментариев:
  1. чем B отличается от C?
  2. почему E с G записали в объявления функций, если E — вызов, а G — объект?
  3. если B и D — разные, то чего уж там, давайте перечислять function foo() {}, function bar() {}, function buzz() {} как разные формы объявления функции. Почему нет?
  4. почему в примерах присваивания a включает результат выполнения функции, а b и c — саму функцию?
  5. Почему «оператор группировки» упоминается отдельно, если он не имеет никакого отношения к объявлению IIFE вообще?
  6. чем примеры ваших операторов, включая запятую, отличаются от того, чтобы заменить IIFE на сразу результат? Где разница между void function... и void 42?
А, ну и лямбды, которые () => 1, забыли?
1. Наличием оператора группировки. Функционально они идентичны.
2. G сделан как дополнительный пример использования ключевого слова function
3. Они разные в том плане что имени может и не быть. Важно было показать что возможен и такой вариант тоже.
4. Это же примеры, хотелось показать оба варианта. В данном случае не очень принципиально наличие вызова функции.
5. Почему не имеет?
6. Примеры выбраны тривиальными чтобы не нагружать статью лишним кодом. А так да, если бы этот код был в реальном проекте, то ваши замечания очень даже по делу.
Принципиальной разницы между вторым и третим вариантом нет

вы в жизни тоже от нуля считаете?
Спасибо за то, что внимательно читали статью, исправил! :)
Недавно пошло дикое поветрие всегда объявлять функции через var a = function () {}. Спрашиваешь зачем — мнутся что-то про хойстинг, но никто внятного ответа не дал, зачем в данном конкретном случае хойстинга надо избежать.
Интересно, где вы это нашли такое. Все мои знакомые спокойно юзают function declaration.

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

Я сегодня отчаянно не выспался — подскажите, почему хойстинг мешает декораторам?

let counter = 0;

let add = function () {
  counter++;
};

@add
function foo() {
}


Соль в том, что из-за всплытия объявление функции foo будет происходить раньше объявления и инициализации переменных counter и add (т. к. function declaration объявляются на входе в блок).
Ну, там по крайней мере присваивают стрелочные функции, а не function expression. Это можно делать для оптимизации — потому что для стрелочных функций не создаются this и arguments, хотя, имхо, это экономия на спичках.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории