Все это происходит потому, что JavaScript имеет два контекста синтаксического анализа: выражение и оператор. Запись function foo() {}
на уровне оператора определяет функцию foo
в этой области, тогда как function foo() {}
на уровне выражения оценивает новую анонимную функцию (которая может рекурсивно вызывать себя как foo
).
Таким образом, всякий раз, когда встречается эта конструкция, парсер должен определить, находится ли он на уровне выражения или оператора. По умолчанию предполагается, что он находится на уровне выписки, если не указано иное. Скобки - это синтаксический способ сказать " это выражение ".
Итак, запись (function() {})
заставляет синтаксический анализатор рассматривать функцию как выражение. Поскольку выражения могут содержать только другие выражения (без операторов), из этого также следует, что если вы напишите (something-that-contains function(){} and-other-stuff)
, то функция в ней все равно будет обрабатываться как выражение.