Code Example 1: Проблема глобальной области видимости
❓ Почему переменные counter и userName доступны через window? В чём проблема такого подхода?
var counter = 0;
var userName = 'John';
function increment() { counter++; }
console.log(window.counter);
console.log(window.userName);
Code Example 2: Синтаксис IIFE
❓ Почему второй вариант выдаёт ошибку, а первый работает? Зачем нужны внешние скобки?
Version A:
(function() {
console.log('Работает!');
})();
Version B:
function() {
console.log('Не сработает');
}();
Code Example 3: Изоляция переменных
❓ Почему во втором примере window.counter возвращает undefined? Что произошло с переменными?
Без IIFE:
var counter = 0;
var data = [];
function add(item) {
data.push(item);
counter++;
}
console.log(window.counter);
console.log(window.data);
С IIFE:
(function() {
var counter = 0;
var data = [];
function add(item) {
data.push(item);
counter++;
}
add('test');
console.log(counter);
})();
console.log(window.counter);
console.log(window.data);
Code Example 4: Возврат значения из IIFE
❓ Что вернёт counter.get() после двух вызовов increment()? Почему counter.count возвращает undefined?
var counter = (function() {
var count = 0;
return {
increment: function() { count++; },
decrement: function() { count--; },
get: function() { return count; }
};
})();
counter.increment();
counter.increment();
console.log(counter.get());
console.log(counter.count);
Code Example 5: Паттерн модуля
❓ Какие части этого модуля являются приватными, а какие публичными? Почему UserModule.users возвращает undefined?
var UserModule = (function() {
var users = [];
var maxUsers = 100;
function validateUser(user) {
return user.name && user.email;
}
return {
add: function(user) {
if (users.length >= maxUsers) {
throw new Error('Лимит пользователей');
}
if (!validateUser(user)) {
throw new Error('Невалидный пользователь');
}
users.push(user);
},
getAll: function() {
return users.slice();
},
count: function() {
return users.length;
}
};
})();
UserModule.add({ name: 'John', email: 'john@example.com' });
console.log(UserModule.count());
console.log(UserModule.users);
Code Example 6: IIFE и this
❓ Что выведет console.log(this) в каждом из этих примеров? Почему результаты разные?
(function() {
'use strict';
console.log(this);
})();
(function() {
console.log(this);
})();
(() => {
console.log(this);
})();