// ДЗ: Замыкания // задание 1 makeProfileTimer { function makeProfileTimer() { const startTime = performance.now(); return function () { return performance.now() - startTime; }; } } { // использование функции var timer = makeProfileTimer(); alert('Замеряем время работы этого alert'); alert(timer() + ' микросекунд'); } // задание 2 makeSaver { function makeSaver(func) { let savedValue; let hasSavedValue = false; return function () { if (!hasSavedValue) { savedValue = func(); hasSavedValue = true; } return savedValue; }; } } // задание 3 моя привязка { function myBind(func, thisArg, defaultArgs) { return function (...args) { let finalArgs = []; for (let i = 0; i < defaultArgs.length; i++) { if (defaultArgs[i] === undefined) { finalArgs.push(args[0]); args.shift(); } else { finalArgs.push(defaultArgs[i]); } } finalArgs = [...finalArgs, ...args]; return func.apply(thisArg, finalArgs); }; } } // задание 4 проверить результат { function checkResult(original, validator) { return function (...params) { let result = original(...params); while (!validator(result)) { result = original(...params); } return result; }; } } { const randomHigh = checkResult(Math.random, (x) => x >= 0.5 && x <= 1); const alwaysSayYes = checkResult(confirm, (x) => x === true); const respectMe = checkResult( () => { const name = prompt('Как Вас зовут?', ''); const age = prompt('Сколько Вам лет?', ''); const profession = prompt('Кем Вы работаете?', ''); return { name, age, profession }; }, (x) => x.name && x.age && x.profession, ); }