Почему в этом анонимном вызове отсутствует скобка?
Я читаю эту книгу и имеет этот пример кода
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));
Скобки, однако, считаются лучшей практикой, потому что они "намекают" на то, что она является мгновенно вызванной функцией без необходимости прокрутки вниз до конца функции.