То есть, действительно, IIFE. Синтаксис, который вы цитируете, - это IIFE из 0 аргументов; Синтаксис, о котором вы просили, - это IIFE из 1 аргумента. Он назначит i
x
во внутреннем коде. Сравнение:
var print0 = function() {
console.log("Hello!");
};
print0();
(по отдельности) эквивалентно
(function() {
console.log("Hello!");
})();
Таким образом, имя: вы создаете функцию, а затем сразу вызываете ее.
Однако, если вам нужен аргумент, ничего не меняется:
var print1 = function(name) {
console.log("Hello, " + name);
};
print1("George");
(изолированно) эквивалентно
(function(name) {
console.log("Hello, " + name);
})("George");
В скобках здесь указано, что определение функции будет выполнено как выражение, а не как утверждение. Существуют и другие способы гарантировать, что общий
!function() {
console.log("Hello!");
}();
(Но есть причины предпочесть круглые скобки.) Поскольку вы используете его в качестве аргумента для вызова setTimeout
, он может Возможно, это заявление, поэтому эти хаки не нужны. Он по-прежнему называется «немедленно вызванным выражением функции», поскольку вы все еще строите выражение функции и сразу вызываете его.
Причина, по которой здесь используется IIFE, заключается в «захвате» значения переменной i
, а не местоположение x
. Без трюка замыкания вы получите 10 тайм-аутов, все выдает 10
(значение местоположения, обозначенное x
при разрешении console.log
).
Да, это так, а (i)
- список аргументов для вызова. Посмотрите здесь для подробного объяснения. В этом случае скобки группировки являются излишними, так как это аргумент для вызова функции setTimeout
и, следовательно, выражения в любом случае.
Термин IIFE относится не только к форме заявления этого шаблона, где скобки были бы необходимы .
Скобки в необязательном порядке в вашем примере сразу вызываемой функции.
(function() {
// some code
})();
Может быть переписана как
function() {
// some code
}();
Итак, i
в примере вызов функции становится x
в определении функции.
function(x) { // x = 1
return function() {
console.log(x); // x = 1
};
}(1)