var IGNORED_TYPES = [
'file',
'reset',
'submit',
'button'
].reduce(function(acc, type) {
acc[type] = 1;
return acc;
}, {});
var VALUE_MISSING_MESSAGES = {
checkbox: msg.valueMissingCheckbox,
radio: msg.valueMissingRadio,
'select-one': msg.valueMissingSelect,
'select-multiple': msg.valueMissingSelectMulti
};
var TYPE_MISMATCH_MESSAGES = {
email: msg.typeMismatchEmail,
url: msg.typeMismatchURL
};
function getError(field) {
var validity = field.validity;
var type = field.type;
switch (true) {
case (validity.valid || field.disabled || type in IGNORED_TYPES):
return;
case validity.valueMissing:
return VALUE_MISSING_MESSAGES[type] || msg.valueMissing;
case (validity.typeMismatch && type in TYPE_MISMATCH_MESSAGES):
return TYPE_MISMATCH_MESSAGES[type];
case validity.tooShort:
return msg.tooShort(field);
case validity.tooLong:
return msg.tooLong(field);
case validity.badInput:
return msg.badInput;
case validity.stepMismatch:
return msg.stepMismatch;
case validity.rangeOverflow:
return msg.rangeOverflow;
case validity.rangeUnderflow:
return msg.rangeUnderflow;
case validity.patternMismatch:
if (field.hasAttribute('title'))
return field.getAttribute('title');
return msg.patternMismatch;
}
return msg.generic;
}
var div = new DOMParser().parseFromString(res.response, 'text/html').querySelector('div.divClass');
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');
}