Я недавно сравнивал текущую версию json2.js с версией, которую я имел в своем проекте и заметил различие в том, как выражение function было создано и сам выполняемый.
Код, используемый, чтобы перенести анонимную функцию в круглую скобку и затем выполнить его,
(function () {
// code here
})();
но теперь это переносит автовыполняемую функцию в круглую скобку.
(function () {
// code here
}());
Существует комментарий CMS в принятом ответе, Объясняет инкапсулированный синтаксис анонимной функции JavaScript что “оба: (function(){})();
и (function(){}());
допустимы”.
Я задавался вопросом, каково различие? Первый поднимает память путем разбрасывания глобальной, анонимной функции? Где круглая скобка должна быть расположена?
Они практически одинаковы.
Первая функция заключает в круглые скобки, чтобы сделать ее допустимым выражением, и вызывает ее. Результат выражения не определен.
Второй выполняет функцию, и круглые скобки вокруг автоматического вызова делают его допустимым выражением. Он также оценивается как undefined.
Я не думаю, что есть «правильный» способ сделать это, поскольку результат выражения тот же.
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
В таком случае это не имеет значения. Вы вызываете выражение, которое преобразуется в функцию в первом определении, а определяете и немедленно вызываете функцию во втором примере. Они похожи, потому что выражение функции в первом примере - это просто определение функции.
Есть и другие, более очевидные полезные случаи для вызова выражений, которые разрешаются в функции:
(foo || bar)()
Нет никакой разницы, кроме синтаксиса.
Что касается вашего беспокойства по поводу второго способа сделать это:
Учтите:
(функция namedfunc () {...} ())
namedfunc
по-прежнему не будет в глобальной области видимости даже если вы указали имя. То же самое и с анонимными функциями. Единственный способ получить его в этой области - присвоить его переменной внутри скобок.
((namedfunc = function namedfunc () { ... })())
Внешние скобки не нужны:
(namedfunc = function namedfunc () { ... })()
Но вы все равно не хотели, чтобы это глобальное объявление, не так ли?
Итак, все сводится к:
(function namedfunc () { ... })()
И вы можете сократить его еще больше: имя ненужным, поскольку он никогда не будет использоваться (если ваша функция не является рекурсивной ... и даже тогда вы можете использовать arguments.callee
)
(function () { ... })()
Я так думаю об этом (может быть, неправильно, я не прочтите еще спецификацию ECMAScript). Надеюсь, поможет.