Является ли запись в скобках для самозависимых функций полезной для 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, но могут быть и другие).