Является ли запись в скобках для самозависимых функций полезной для Javascript?

Я запутываюсь, когда вижу примеры самозависимых анонимных функций в Javascript, например:

(function () { return val;}) ();

Есть ли разница между этим синтаксисом и следующим:

function() { return val;} ();

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

Ответ 1

Javascript не имеет области блока, поэтому это способ создания временной локальной области, которая не загрязняет глобальное пространство имен. Круглые скобки служат двум целям:

  • Некоторые реализации javascript отбрасываются, если они отсутствуют.
  • Он сигнализирует читателям, что происходит что-то, отличное от объявления нормальной функции. Так как соглашение, это сигнализирует, что эта функция используется как область.

см. здесь: http://peter.michaux.ca/articles/an-important-pair-of-parens

Ответ 2

В Safari 4 следующий код (без круглых скобок) приводит к ошибке "SyntaxError: Parse error":

function() { alert("Test"); }();

... но следующий код работает так, как ожидалось:

(function() { alert("Test"); })();

Обновление. Я также пробовал код в Firefox 3 (через Firebug), и он вел себя так же, как Safari.

Ответ 3

Причина

function() { return val;} ();

не работает, потому что это выражение , а не выражение . Это довольно незначительное различие, но в основном, если инструкция начинается с function, это точно так же, как декларация функции C, и вы не можете вызвать функцию, потому что нет значения выражения.

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

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

var value = function() { alert("works"); return 0; }();
(function() { alert("works"); })();

но это не так:

function() { alert("doesn't work"); }();

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

Ответ 4

Насколько я знаю, единственное различие заключается в том, что последнее иногда не работает в определенных вариантах ECMAScript (а именно ActionScript, но могут быть и другие).