function makeGetRandomElement(initialArray) {
var arr;
function randomIndex() {
return Math.floor(Math.random() * arr.length);
}
function reinitArray() {
arr = initialArray.slice();
}
reinitArray();
return function getRandomElement() {
if(arr.length === 0) reinitArray();
return arr.splice(randomIndex(), 1)[0];
}
}
// использование
var getRandomElement = makeGetRandomElement([1, 2, 3, 4, 5, 6, 7]);
console.log(getRandomElement());
console.log(getRandomElement());
console.log(getRandomElement());
console.log(getRandomElement());
console.log(getRandomElement());
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;
}
Я занимался разработкой веб-приложенийПредполагаю, что Вы знаете JS, тогда почему бы не выбрать его?
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 мы не можем
// инкапсуляция нам не дает поломать данные