Почему IIFE стрелочная функция не работает, когда работает обычная IIFE?

Почему такой код работает:

(function() {
  console.log(10);
}());

А такой же код, но уже через стрелочную функцию - не работает:

(() => {
  console.log(10);
}());

И чтобы заработало нужно писать так:

(() => {
  console.log(10);
})();


Ответы (2 шт):

Автор решения: Aziz Umarov

Ответ понятно что таков синтаксис. Я просто думаю, сделано так чтоб не чесались руки сделать простую замену function () на () => во всех проектах не глядя. Хотя бы потому что контекст this в стрелочной функции и в обычной отличаются.

→ Ссылка
Автор решения: vsemozhebuty

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

Причина разницы парсинга в том, что обычная функция и стрелочная по спецификации относятся к разным синтаксическим сущностям (CallExpression vs AssignmentExpression), и после подвида стрелочной функции не могут стоять скобки вызова.

Если погуглить, можно понатыкаться на объяснения:

https://github.com/airbnb/javascript/issues/828

https://stackoverflow.com/a/34589765/2625560

https://github.com/babel/babel/issues/2118

→ Ссылка