Browse Source

<HW_closures>upd done

Mark 1 year ago
parent
commit
a9e65c045d
1 changed files with 35 additions and 2 deletions
  1. 35 2
      09/main.js

+ 35 - 2
09/main.js

@@ -46,8 +46,6 @@ var value4 = saver2()
 
 value3 === value4 // тоже должно быть true
 
-
-
 let namePrompt = prompt.bind(window, 'Как тебя зовут?')
 let nameSaver = makeSaver(namePrompt)
 alert(`Привет! Prompt еще не было!`)
@@ -55,6 +53,41 @@ alert(`Привет ${nameSaver()}. Только что запустился pro
 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'
+