Почему в этом анонимном вызове отсутствует скобка?

Я читаю эту книгу и имеет этот пример кода

function getFunction() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = function(num) {
            return function() {
                console.log("this is " + num);
            }
        }(i);
    };

    return result;
}

Он работает нормально, но почему анонимная функция здесь не завернута в круглые скобки вроде этого (function(...))(i);? И в каких случаях круглые скобки могут быть опущены в анонимной функции?

Ответы

Ответ 1

Поскольку синтаксис объявлений функций и выражений функций идентичен, JS сообщает, какой из них вы используете из кода вокруг функции.

Чтобы остановить это объявление функции, вам нужно использовать его в выражении. Обертка его в скобках будет делать это, но предшествует ей с помощью = тоже (как и множество других операторов). Поскольку здесь существует =, скобки не нужны.

Ответ 2

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

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

Ответ 3

Объявление регулярной функции выглядит следующим образом:

function FuncName() { doSomething(); }

Затем вы можете вызвать эту функцию следующим образом:

FuncName();

Анонимные функции очень похожи:

var FuncName = function YouCanEvenPutANameHereAndItWillBeIgnored() { doSomething(); }

Если синтаксис регулярных функций и анонимных функций идентичен, то как JS их отличает? Он выводит то, что вы подразумеваете под контекстом. Вот почему это мгновенно вызывается выражение функции не будет работать:

function(s) { console.log(s); } ('abc');

JS-анализатор читает его слева. Строка начинается с function, поэтому JS догадывается о ее объявлении регулярной функции и ожидает, что она закончится с помощью }. Там ('abc') после функции, однако, и JS выдает ошибку.

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

(function(s) { console.log(s); }) ('abc');

Есть и другие способы. Они менее читаемы, но они тоже работают.

( function(s) { console.log(s); } ('abc') );
+function(s) { console.log(s); } ('abc');
-function(s) { console.log(s); } ('abc');
1 * function(s) { console.log(s); } ('abc');

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

Ответ 4

Это сразу вызываемые функциональные выражения (IIFE). они могут использоваться везде, где ожидается выражение. примеры находятся в правой части знака равенства или любой стороны оператора сравнения или даже как аргумент для другой функции. Если нужна скобка, если они используются там, где выражение не ожидается. например, в следующем примере

var a=1;
(function(b){
  a=b;
})(2);
console.log(a);

Какие выходы 2.

В любом случае ожидается, что выражение эквивалентно

function(a){....}(b);

(function(a){....})(b);

(function(a){....}(b));

Скобки, однако, считаются лучшей практикой, потому что они "намекают" на то, что она является мгновенно вызванной функцией без необходимости прокрутки вниз до конца функции.