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 мы не можем
// инкапсуляция нам не дает поломать данные
let user = {
firstName: "Вася",
sayHi: () => {
console.log( this.firstName );
}
};
user.sayHi();
Почему функция возвращает undifinded?
Как вернуть результат из setInterval?
function f() {
setTimeout(console.log, 500, 1);
}
f(); // 1
function f(cb) {
setTimeout(cb, 500, 1);
}
f(console.log); // 1
function f() {
return new Promise(resolve => {
setTimeout(resolve, 500, 1);
});
}
f().then(console.log); // 1
const fs = require('fs');
fs.readdir('./folder', (err, files) => {
files.forEach(file => {
console.log(file);
});
})
var tempScrollTop=0,
currentScrollTop;
$(window).scroll(function(){
currentScrollTop = $(window).scrollTop();
if (tempScrollTop < currentScrollTop ){
alert("Вниз");
}
else if (tempScrollTop > currentScrollTop ) {
alert("Вверх");
}
tempScrollTop = currentScrollTop;
});
var
.var tempScrollTop
, currentScrollTop = 0
;
tempScrollTop
остаётся неинициализированной, её значение undefined
, а во 2-м варианте ей даётся начальное значение 0
. tempScrollTop = currentScrollTop;
укажите var, то при следующем вызове функции в переменной не сохраняется предыдущего значения.