|
@@ -0,0 +1,54 @@
|
|
|
+<header>My bind</header>
|
|
|
+
|
|
|
+<body>
|
|
|
+ <script>
|
|
|
+ const myBind = (myFunc, myThis, [...myDefArgs]) => {
|
|
|
+ const bindFunc = (...args) => {
|
|
|
+ let curArgs = [];
|
|
|
+ let i = 0;
|
|
|
+ let argsLength = args.length;
|
|
|
+ for (defArg of myDefArgs) {
|
|
|
+ if (defArg == null) {
|
|
|
+ if (i < argsLength) {
|
|
|
+ curArgs.push(args[i]);
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ curArgs.push(defArg);
|
|
|
+ }
|
|
|
+ for (; i < argsLength; i++)
|
|
|
+ curArgs.push(args[i]);
|
|
|
+ return myFunc.call(myThis, ...curArgs);
|
|
|
+ /*var myBindedFunc = myFunc.bind(myThis, ...curArgs);
|
|
|
+ return myBindedFunc();*/
|
|
|
+
|
|
|
+ }
|
|
|
+ return bindFunc;
|
|
|
+ }
|
|
|
+ var pow5 = myBind(Math.pow, Math, [, 5]) // первый параметр - функция для биндинга значений по умолчанию,
|
|
|
+ // второй - this для этой функции, третий - массив, в котором undefined означает
|
|
|
+ // параметры, которые должны передаваться при вызове,
|
|
|
+ // а другие значения являются значениями по умолчанию:
|
|
|
+ var cube = myBind(Math.pow, Math, [, 3]) // cube возводит число в куб
|
|
|
+
|
|
|
+ pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
|
|
|
+ cube(3) // => 27
|
|
|
+
|
|
|
+
|
|
|
+ var chessMin = myBind(Math.min, Math, [, 4, , 5, , 8, , 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")
|
|
|
+
|
|
|
+ const bindedJoiner = myBind((...params) => params.join(''), null, [, 'b', , , 'e', 'f'])//('a','c','d') === 'abcdef'
|
|
|
+ bindedJoiner('a', 'c', 'd') === 'abcdef'
|
|
|
+ bindedJoiner('1', '2', '3') === '1b23ef'
|
|
|
+ console.log(bindedJoiner('a', 'c', 'd'));
|
|
|
+ console.log(bindedJoiner('1', '2', '3'));
|
|
|
+ </script>
|
|
|
+</body>
|