Самоисполняющиеся функции [дубликаты]

Possible Duplicate:
Difference between (function(){})(); and function(){}();

Я пытаюсь понять некоторые особенности JavaScript немного лучше. ВThe Definitive JavaScript в нем говорится, что у самозапускающихся функций должны быть квадратные скобки, например:

var obj = (function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    }
})();

но вJavaScript - The Good Parts откуда взят этот пример, у него есть вышеуказанная функция, выполняемая без круглых скобок, например:

var obj = function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    }
}();

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

Большое спасибо.

Edit:

Как указал Роб У., на эту тему есть еще одна тема.Это отличный блог по этой проблеме это было связано с другим постом.

 Alnitak18 июн. 2012 г., 16:56
@ Джо, ты бы пропустилvar obj если вы хотите, чтобы функция работала (т.е. вы хотите получить ее побочные эффекты), но она либо не возвращает никакого значения, либо вам все равно, какое у нее возвращаемое значение.
 Joe18 июн. 2012 г., 16:55
Большое спасибо, Роб. Просто интересно узнать: в каких ситуациях я бы пропустилvar obj = ? Это вернет объект объекту верхнего уровня, не так ли? Приветствия.
 Rob W18 июн. 2012 г., 16:51
В этом случае оба эквивалентны. Когда вы опускаетеvar obj = тогда последний выдаст ошибку. Итак, придерживайтесь # 1, если байты не станут дорогими.

Ответы на вопрос(3)

но я думаю, что круглые скобки делают его намного более читабельным. Откуда ты знаешь, как это обходится без паренов? Это поднят?Это блестящая нить на предмет.

ASIDE:

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

Решение Вопроса

В этом случае нет никакой разницы, ноonly потому что он имеет префикс:

var obj = ...

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

Вы бы, конечно, только опуститьvar obj если вы только хотите, чтобы функция работала (т.е. вы хотите получить ее побочные эффекты), но она либо не возвращает значение, либо вас не волнует, какое ее возвращаемое значение.

The Good Parts был написан Дугом Крокфордом, который обновил свой пример, чтобы он выглядел так:

var obj = (function() {
    var value = 0;

    return {
        increment: function(inc) {
            value += typeof inc === "number" ? inc : 1;
        },
        getValue: function() {
            return value;
        }
    };
}());

Таким образом, все выражение находится в скобках.

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

Ваш ответ на вопрос