/* makeProfileTimer */ function makeProfileTimer() { let time1 = performance.now() return function t() { let time2 = performance.now() return time2 - time1 } } var timer = makeProfileTimer() alert('Замеряем время работы этого alert'); alert(timer()); /* makeSaver */ function makeSaver(func){ let result = func(); return function(){ return result; } } var saver = makeSaver(Math.random) var value1 = saver() var value2 = saver() value1 === value2 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 let namePrompt = prompt.bind(window, 'Как тебя зовут?') let nameSaver = makeSaver(namePrompt) alert(`Привет! Prompt еще не было!`) alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`) alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`) /* Final Countdown */ (function (time = 0) { for (let i = 5; i >= 0; i--) { setTimeout(() => { if (i) { console.log(i) } else { console.log("поехали") } }, (time++) * 1000) } })() /* MyBind */ var myBind = function(fn, context, arr) { return function() { let index = 0 var fnArgs = [].slice.call(arguments); return fn.apply(context, arr.map(i => { if(i === undefined){ let newValue = fnArgs[index] index++ return newValue } else return i })); }; }; var pow5 = myBind(Math.pow, Math, [undefined, 5]) console.log(pow5(2)) var cube = myBind(Math.pow, Math, [undefined, 3]) console.log(cube(3)) var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9]) console.log(chessMin(-1,-5,3,15)) var zeroPrompt = myBind(prompt, window, [undefined, "0"]) var someNumber = zeroPrompt("Введите число") console.log( myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef' )