// makeProfileTimer function makeProfileTimer() { let prevTime = performance.now(); function changeTime() { let nextTime = performance.now(); return ('Время выполнения alert: ' + (nextTime - prevTime)); } return changeTime; } let timer = makeProfileTimer() alert('Замеряем время работы этого alert'); alert(timer()) // or function makeProfileTimer() { alert('Замеряем время работы этого alert'); } console.time('FirstWay'); makeProfileTimer(); console.timeEnd('FirstWay'); // makeSaver function makeSaver(f) { let start = false; let result; return () => { if (start === false) { result = f(); start = true; } return result; } } let nameSarver = makeSaver(() => prompt('Введите имя')) alert('Имя еще не спрашивали') let name1 = nameSarver() alert('Тока шо спросили имя') let name2 = nameSarver() alert('Два раза спрашивать имя - значит склероз') alert('Привет, ' + name1 + ((name1 === name2) ? '. Задача решена' : 'Какая-то дичь')) var saver = makeSaver(Math.random) var value1 = saver() var value2 = saver() value1 === value2 // всегда true var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random()*6)]) var value3 = saver2() var value4 = saver2() value3 === value4 // тоже должно быть true // Final Countdown function SelfInvoked() { let countdown = 5; function t() { console.log(countdown--); setTimeout(() => console.log('поехали!'), 5000); if(!countdown) clearInterval(timer); } let timer = setInterval(t, 1000); } SelfInvoked() // запуск функции 5 //пауза 1 секунда 4 //пауза 1 секунда 3 //пауза 1 секунда 2 //пауза 1 секунда 1 //пауза 1 секунда // поехали! // myBind // решение function myBind (func, context, args) { return (...params) => { let defaultValue = 0; let newArgs = args.map((i) => (i === undefined ? params[defaultValue++] : i)); return func.call(context, ... newArgs); } } // условие var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию, // второй - this для этой функции, третий - массив, в котором undefined означает // параметры, которые должны передаваться при вызове, // а другие значения являются значениями по умолчанию: var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5] cube(3) // => 27 var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9]) chessMin(-1,-5,3,15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5 var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt, // а текст приглашения пользователя задается при вызове zeroPrompt var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0") myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef'