1. Для чего замыкание существуют?Для инкапсуляции данных.
2. В каких условиях они создаются?Когда вложенная функция обращается к переменным внешней функции.
// makeCounter - внешняя функция
function makeCounter(initialValue) {
var value = +initialValue || 0;
// counter - внутренняя функция
// она использует переменную value из внешней функции
// что-бы это было возможным, для counter создается замыкание,
// в котором хранится переменная value
// переменная initialValue функции counter не нужна, поэтому ее можно "забыть"
return function counter() {
return value++;
};
}
// у нас 3 экземпляра функции counter
var counter1 = makeCounter();
var counter2 = makeCounter();
var counter3 = makeCounter(100);
// и для каждой есть своя переменная value
console.log(counter1()); // 0
console.log(counter1()); // 1
console.log(counter2()); // 0
console.log(counter1()); // 2
console.log(counter3()); // 100
// а вот получить как-то напрямую переменную value мы не можем
// инкапсуляция нам не дает поломать данные
Slider.prototype = {
init: function () {
let slidesCounter = 0;
if(! (settings.pointNavigation)){
function Slider(settings){
this.el = document.querySelector(settings.element);
this.settings = settings;
this.init();
}
Slider.prototype = {
init: function () {
let slidesCounter = 0;
if(! (this.settings.pointNavigation)){
// ...
// пусть value - результат операции справа от await
// resolve - функция, которая получает 1 аргумент, который вернет await
// (но не раньше выполнения микротасков event loop)
// reject - функция, которая получает 1 аргумент, который пробросит исключение в await
// (но не раньше выполнения микротасков event loop)
if(value && typeof value.then === 'function') {
value.then(resolve, reject);
} else {
resolve(value);
}
async function my_function() {
console.log('1');
await new Promise(resolve => setTimeout(resolve, 1000));
console.log('2');
console.log('3');
}
async function my_function() {
console.log('1');
await {then(resolve) { setTimeout(resolve, 1000); }};
console.log('2');
console.log('3');
}
router.get('/1', ctx => new Promise(resolve => {
mongoClient.connect(url, (err, client) => {
client.db("qq").collection("bb").find({}).toArray((err, users) => {
ctx.body = users;
console.log(users);
client.close();
resolve();
});
});
}));
class ProgressBar {
constructor(wrapper, line) {
this.wrapper = wrapper;
this.line = line;
// передаем объект а не функцию оО
wrapper.addEventListener('mousemove', this);
wrapper.removeEventListener('mousemove', this);
}
// что бы использовать объект в качестве слушателя,
// у него должен быть метод handleEvent - именно он будет получать события
handleEvent(event) {
this.line.style.width = event.clientX + 'px'
}
}