Местоположение круглой скобки для автовыполнения анонимных функций JavaScript?

Я недавно сравнивал текущую версию json2.js с версией, которую я имел в своем проекте и заметил различие в том, как выражение function было создано и сам выполняемый.

Код, используемый, чтобы перенести анонимную функцию в круглую скобку и затем выполнить его,

(function () {
  // code here
})();

но теперь это переносит автовыполняемую функцию в круглую скобку.

(function () {
  // code here
}());

Существует комментарий CMS в принятом ответе, Объясняет инкапсулированный синтаксис анонимной функции JavaScript что “оба: (function(){})(); и (function(){}()); допустимы”.

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

105
задан Community 23 May 2017 в 10:31
поделиться

3 ответа

Они практически одинаковы.

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

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

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

> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
64
ответ дан 24 November 2019 в 04:02
поделиться

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

Есть и другие, более очевидные полезные случаи для вызова выражений, которые разрешаются в функции:

(foo || bar)()
13
ответ дан 24 November 2019 в 04:02
поделиться

Нет никакой разницы, кроме синтаксиса.

Что касается вашего беспокойства по поводу второго способа сделать это:

Учтите:

(функция namedfunc () {...} ())

namedfunc по-прежнему не будет в глобальной области видимости даже если вы указали имя. То же самое и с анонимными функциями. Единственный способ получить его в этой области - присвоить его переменной внутри скобок.

((namedfunc = function namedfunc () { ... })())

Внешние скобки не нужны:

(namedfunc = function namedfunc () { ... })()

Но вы все равно не хотели, чтобы это глобальное объявление, не так ли?

Итак, все сводится к:

(function namedfunc () { ... })()

И вы можете сократить его еще больше: имя ненужным, поскольку он никогда не будет использоваться (если ваша функция не является рекурсивной ... и даже тогда вы можете использовать arguments.callee )

(function () { ... })()

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

9
ответ дан 24 November 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: