Комментарии 23
Основной смысл записи var f = function myFunc(){ } заключается в нормальных именах в стеке вызовов при отладке.
Что в ES6 уже не имело смысла из-за автоматического вывода имен анонимных функций из переменных и контекста объявления.
К сожалению, свойство
name
у анонимных функций все еще не выводится из имени переменной, только из явного объявления имени функции. Мелочь, конечно, но иногда все же неудобно.Свойство name — нет, правда ваша. В стек-трейсах же все отображается наглядно — github.com/v8/v8/blob/master/test/cctest/test-func-name-inference.cc
Да ладно? :) 12.14.4 -> 1 -> e -> ii
Ещё именованные функции распространяются на весь код сразу, а безымянные только на тот, который идёт после объявления этой функции. Тоже вполне важное отличие, но не столь существенное, согласен.
Это для удобства рекурсивного вызова. По имени функция доступна внутри себя. Правда, в ИЕ8 есть проблемы — имя оказывается доступно извне.
После прочтения статьи возникло несколько вопросов и комментариев:
- чем B отличается от C?
- почему E с G записали в объявления функций, если E — вызов, а G — объект?
- если B и D — разные, то чего уж там, давайте перечислять
function foo() {}
,function bar() {}
,function buzz() {}
как разные формы объявления функции. Почему нет? - почему в примерах присваивания
a
включает результат выполнения функции, аb
иc
— саму функцию? - Почему «оператор группировки» упоминается отдельно, если он не имеет никакого отношения к объявлению IIFE вообще?
- чем примеры ваших операторов, включая запятую, отличаются от того, чтобы заменить IIFE на сразу результат? Где разница между
void function...
иvoid 42
?
А, ну и лямбды, которые
() => 1
, забыли?1. Наличием оператора группировки. Функционально они идентичны.
2. G сделан как дополнительный пример использования ключевого слова
3. Они разные в том плане что имени может и не быть. Важно было показать что возможен и такой вариант тоже.
4. Это же примеры, хотелось показать оба варианта. В данном случае не очень принципиально наличие вызова функции.
5. Почему не имеет?
6. Примеры выбраны тривиальными чтобы не нагружать статью лишним кодом. А так да, если бы этот код был в реальном проекте, то ваши замечания очень даже по делу.
2. G сделан как дополнительный пример использования ключевого слова
function
3. Они разные в том плане что имени может и не быть. Важно было показать что возможен и такой вариант тоже.
4. Это же примеры, хотелось показать оба варианта. В данном случае не очень принципиально наличие вызова функции.
5. Почему не имеет?
6. Примеры выбраны тривиальными чтобы не нагружать статью лишним кодом. А так да, если бы этот код был в реальном проекте, то ваши замечания очень даже по делу.
Принципиальной разницы между вторым и третим вариантом нет
вы в жизни тоже от нуля считаете?
Недавно пошло дикое поветрие всегда объявлять функции через
var a = function () {}
. Спрашиваешь зачем — мнутся что-то про хойстинг, но никто внятного ответа не дал, зачем в данном конкретном случае хойстинга надо избежать.Интересно, где вы это нашли такое. Все мои знакомые спокойно юзают function declaration.
Лично у меня сейчас ко всплытию только одна претензия — из-за него нельзя сделать нормальные декораторы для функций.
Лично у меня сейчас ко всплытию только одна претензия — из-за него нельзя сделать нормальные декораторы для функций.
На работе и еще в паре мест, неважно.
Я сегодня отчаянно не выспался — подскажите, почему хойстинг мешает декораторам?
Я сегодня отчаянно не выспался — подскажите, почему хойстинг мешает декораторам?
Вот свежий пример: habrahabr.ru/post/274887/#comment_8734559
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Функциональные выражения в JavaScript