То есть, действительно, 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
).