123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- // makeProfileTimer
- function makeProfileTimer() {
- let first = performance.now();
- return function () {
- let second = performance.now();
- return second - first
- };
- }
- var timer = makeProfileTimer();
- alert("Замеряем время работы этого alert");
- alert(`${timer()} ms`);
- // Final Countdown
- for (let i = 0; i <= 5; i++) {
- setTimeout(() => { i === 5 ? console.log('поехали!') : console.log(5 - i) }, i * 1000)
- }
- // makeSaver
- function makeSaver(data) {
- let hasBeenCalled = false;
- let cashedResult;
- return function (...args) {
- if (hasBeenCalled) {
- return cashedResult;
- }
- else {
- hasBeenCalled = true;
- cashedResult = data(...args);
- return cashedResult;
- }
- }
- }
- var saver = makeSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random
- // в примере). На этом этапе Math.random НЕ вызывается
- var value1 = saver() //saver вызывает переданную в makeSaver функцию, запоминает результат и возвращает его
- var value2 = saver() //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную
- //в makeSaver функцию;
- 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
- let namePrompt = prompt.bind(window, 'Как тебя зовут?')
- let nameSaver = makeSaver(namePrompt)
- alert(`Привет! Prompt еще не было!`)
- alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
- alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)
- // myBind
- let myBind = function (fn, Math, arr) {
- return function () {
- index = 0;
- let newArr = [...arguments];
- return fn.apply(Math, arr.map(i => {
- if (i === undefined) {
- let number = newArr[index]
- index++
- return number
- }
- else return i
- }));
- };
- };
- 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'
|