hw12_03_MyBind.html 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <header>My bind</header>
  2. <body>
  3. <script>
  4. const myBind = (myFunc, myThis, [...myDefArgs]) => {
  5. const bindFunc = (...args) => {
  6. let curArgs = [];
  7. let i = 0;
  8. let argsLength = args.length;
  9. for (defArg of myDefArgs) {
  10. if (defArg == null) {
  11. if (i < argsLength) {
  12. curArgs.push(args[i]);
  13. i++;
  14. }
  15. }
  16. else
  17. curArgs.push(defArg);
  18. }
  19. for (; i < argsLength; i++)
  20. curArgs.push(args[i]);
  21. return myFunc.call(myThis, ...curArgs);
  22. /*var myBindedFunc = myFunc.bind(myThis, ...curArgs);
  23. return myBindedFunc();*/
  24. }
  25. return bindFunc;
  26. }
  27. var pow5 = myBind(Math.pow, Math, [, 5]) // первый параметр - функция для биндинга значений по умолчанию,
  28. // второй - this для этой функции, третий - массив, в котором undefined означает
  29. // параметры, которые должны передаваться при вызове,
  30. // а другие значения являются значениями по умолчанию:
  31. var cube = myBind(Math.pow, Math, [, 3]) // cube возводит число в куб
  32. pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
  33. cube(3) // => 27
  34. var chessMin = myBind(Math.min, Math, [, 4, , 5, , 8, , 9])
  35. chessMin(-1, -5, 3, 15) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5
  36. var zeroPrompt = myBind(prompt, window, [undefined, "0"]) // аналогично, только теперь задается "0" как текст по умолчанию в prompt,
  37. // а текст приглашения пользователя задается при вызове zeroPrompt
  38. var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")
  39. const bindedJoiner = myBind((...params) => params.join(''), null, [, 'b', , , 'e', 'f'])//('a','c','d') === 'abcdef'
  40. bindedJoiner('a', 'c', 'd') === 'abcdef'
  41. bindedJoiner('1', '2', '3') === '1b23ef'
  42. console.log(bindedJoiner('a', 'c', 'd'));
  43. console.log(bindedJoiner('1', '2', '3'));
  44. </script>
  45. </body>