IIFE
IIFE: немедленно вызываемое функциональное выражение, которое преобразуется в немедленно вызываемое функциональное выражение. То есть функция вызывается сразу же при объявлении функции.
Объявления обычных функций и вызовы функций
function bar() {
var a = 10;
console.log(a);
}
bar(); // 函数调用
Объявление и вызов функции IIFE
(function foo(){
var a = 10;
console.log(a);
})();
Во-первых, обратите внимание, что функция IIFE состоит из пары) будет обернута декларация функции (выражения. JS заставляет компилятор больше не думать, что это объявление функции, а IIFE, а именно немедленно выполнять выражения функции. Но оба достигают цели одинаково, оба объявляют функцию, а затем вызывают эту функцию.
Зачем использовать IIFE
Если это просто немедленное выполнение функции, очевидно, что преимущества IIFE ограничены. На самом деле появление IIFE призвано компенсировать недостатки JS с точки зрения масштаба: JS имеет только глобальный масштаб, масштаб функций и масштаб блоков, начиная с ES6. По сравнению с другими популярными объектно-ориентированными языками видно, насколько JS хрупок с точки зрения контроля доступа! Так как же добиться изоляции области видимости? В JS только функции могут обеспечить изоляцию области действия, поэтому, если вы хотите изолировать определения переменных, функций и т. д. в фрагменте кода, вы можете только инкапсулировать этот фрагмент кода в функцию.
Обеспечьте изоляцию областей, конфликты имен и уменьшите объем памяти для функций, которые вызываются один раз.
область действия блока
В ES5 нет понятия области блока. только глобальная область действия и область действия функции
for (var i = 0; i< 10; i++) {
console.log(i);
}
console.log(i); // 10
Это место можно увидеть в переменной цикла for, я глобальная переменная, цикл for завершается после этого, к которому у меня все еще есть доступ. я не был уничтожен
块级作用域也可以称为私有作用域。 That is to say, it is only defined in the statement block of the for loop. Once the loop ends, the variable i will be destroyed. In ES5, we mainly use the anonymous function [IIFE] to achieve the effect of block-level объем.
IIFE реализует изоляцию области
// 函数声明语句写法
function test() {};
test();
// 函数表达式写法
var test = function(){};
test();
[Примечание] Двигатель JavaScript предусматривает, что если ключевое слово функции появится в начале, будет интерпретироваться как оператор декларации функций; и после того, как функция не будет объявлена с скобками (анонимная функция - это объявление функции). Однако после того, как экспрессия функции может сопровождаться скобками. Он может быть преобразован в функцию функции объявления функции. Переменные в функции немедленного выполнения определены сразу
(function(){
console.log('123');
}());
(function(){
console.log('123');
})();
(function foo(){
console.log('123');
})();
точка с запятой
(function(){
console.log('a');
})()
(function(){
console.log('b');
})()
В этом фрагменте кода может отображаться только a, а b сообщит об ошибке
TypeError: (intermediate value)(...) is not a function
Без точки с запятой приведенный выше контент будет интерпретироваться JS как:
(function(){
console.log('a');
})()(function(){
console.log('b');
})()
Мы можем изменить
(function(){
console.log('a');
})()
(function(){
console.log('b');
}())
Преимущества ИИФЭ
- Создание области на уровне блока (частной) позволяет избежать добавления переменных и функций в глобальную область, тем самым избегая конфликтов имен для глобальных переменных и функций при разработке для нескольких человек.
- Любые переменные и функции, определенные в IIFE, будут уничтожены в конце выполнения.Этот подход может уменьшить проблему памяти, занимаемой замыканиями, поскольку нет ссылок на анонимные функции. Как только функция завершает выполнение, ее цепочка областей видимости может быть немедленно уничтожена.
Добро пожаловать в общественное число WeChat