Ivan Grinkin 8 years ago
parent
commit
890670a130
1 changed files with 26 additions and 1 deletions
  1. 26 1
      07ObjectsFunctionalStyleHomeWork.md

+ 26 - 1
07ObjectsFunctionalStyleHomeWork.md

@@ -41,6 +41,31 @@
    doSomething(); //некий код, время выполнения которого мы хотим измерить с высокой точностью
    alert(timer()); //alert должен вывести время в микросекундах от выполнения makeProfileTimer до момента вызова timer(), т. е. измерить время выполнения doSomething
 ```
+
     Используйте `performance.now()` 
 
-- 
+- Напишите функцию `getSaver`, которая:
+
+```javascript
+    var saver = getSaver(Math.random) //создает функцию-хранилище результата переданной в качестве параметра функции (Math.random в примере). На этом этапе Math.random НЕ вызывается
+    var value1 = saver()              //saver вызывает переданную в getSaver функцию, запоминает результат и возвращает его
+    var value2 = saver()              //saver в дальнейшем просто хранит результат функции, и более НЕ вызывает переданную в getSaver функцию;
+    value1 === value2                 // всегда true
+```
+
+    Таким образом `getSaver` решает две задачи:
+    0. Навсегда сохраняет результат функции. Это актуально, например, для `Math.random`.
+    1. Действует *лениво*, то есть вызывает `Math.random` только тогда, когда результат *действительно* нужен. Если же по каким-то причинам значение не понадобится, то `Math.random` даже не будет вызыван
+
+- Изучите встроенную функцию `bind`, и сделайте свою версию, которая позволит определить "значение по умолчанию" не только для первых параметров, но для любых других, например для *степени* в Math.pow:
+
+```javascript
+var pow5 = myBind(Math.pow, Math, [undefined, 5]) // первый параметр - функция для биндинга значений по умолчанию, второй - this для этой функции, третий - массив, в котором undefined означает
+//параметры, которые должны передаваться при вызове, а другие значения являются значениями по умолчанию:
+pow5(2) // вызывает Math.pow(2,5), соотнесите с [undefined, 5]
+
+var zeroPrompt = myBind(prompt, window, [undefined, "0"]) //аналогично, только теперь задается "0" как текст по умолчанию в prompt, а текст приглашения пользователя задается при вызове zeroPrompt
+var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
+```
+    Массив, который идет третьим параметром определяет, какие поля должны подменяться значением по умолчанию, а какие - задаваться в последствии (undefined).
+