Я только что прочитал статью Бена Алмана на Immediate-Invoked Function Expressions и задался вопросом об этой части, где он представляет функциональные выражения и замыкания (еще не связанные с IIFE):
// ...doesn't it stand to reason that the function expression itself can // be invoked, just by putting () after it? function(){ /* code goes here */ }(); // This works! Well, almost. A minor JavaScript syntax issue actually // requires that ambiguity between function declarations and function // expressions be eliminated, which can be done by wrapping the function // expression in parens. // The following pattern is used universally to create an anonymous // closure with "privacy": (function(){ /* code goes here */ })(); // This parens syntax is also valid (I prefer the previous version): (function(){ /* code goes here */ }());
Последняя часть поразила меня. Кто-нибудь может объяснить, почему существуют две разные синтаксические версии для вызова функциональных выражений?
Был ли этот синтаксис сознательно введен только для вызова анонимных замыканий? Или это побочный продукт какого-то другого синтаксического свойства?
Почему вторая версия все равно работает? Первый имеет смысл для меня с точки зрения парсера. Первая пара скобок оценивается как объект функции, вторая пара вызывает этот объект функции. Но второй? Не похоже, что он разрешает упомянутую синтаксическую двусмысленность.
Может ли кто-нибудь сказать мне, что мне здесь не хватает?