123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- function makeProfileTimer() {
- let time1 = performance.now()
- let timeInner = () => {
- let time2 = performance.now()
- return time2 - time1
- }
- return timeInner;
- }
- // var timer = makeProfileTimer()
- // alert('Замеряем время работы этого alert'); //некий код, время выполнения которого мы хотим измерить с высокой точностью
- // alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(),
- // // т. е. измерить время выполнения alert
- function makeSaver(funk) {
- let savedResult
- let saverInner = () => {
- if (savedResult == undefined) {
- savedResult = funk()
-
- }
- return savedResult
- }
-
- return saverInner
- }
- 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
- function starter (number) {
- console.log(number)
- number = number - 1
- starterInner()
- function starterInner() {
- setTimeout(() => {
- if(number > 0){
- console.log(number)
- number = number-1
- return starterInner(number)
- } else {
- return console.log("done")
- }
- }, 1000)
- }
- }
- // starter(5)
- ///myBind
- function myBind(funk, context) {
- let arg = [].slice.call(arguments, 2);
- arg = arg[0].filter(index => index != undefined)
- return function () {
- debugger
- let newArg = [].slice.call(arguments);
- return funk.apply(context, newArg.concat(arg))
- }
- }
- var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию,
- // второй - this для этой функции, третий - массив, в котором undefined означает
- // параметры, которые должны передаваться при вызове,
- // а другие значения являются значениями по умолчанию:
- var cube = myBind(Math.pow, Math, [undefined, 3]) // cube возводит число в куб
- console.log(pow5(2)) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
- console.log(cube(3)) // => 27
- var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
- console.log(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")
|