Правильно ли я понимаю, что curriedSum(1)(2,3) - здесь в качества a - цифра 1, а в качестве b - (2,3) ? А как же c?
А здесь тогда как? curriedSum(1)(2)(3) - где здесь каррирование?
let curriedSum = curry(sum); // сделали функцию sum карируемой.
var one = curriedSum(1) // так как sum ожидает 3 аргумента, то этот вызов вернёт функццию, которая помнит 1 и ожидает ещё 2 аргумента.
var onePlusTwo = one(2) // так как sum ожидает 3 аргумента, то этот вызов вернёт функццию, которая помнит 1 и 2 и ожидает ещё 1 аргумент.
var result = onePlusTwo(3) // так как sum ожидает 3 аргумента, два аргумента уже помнит функция onePlusTwo и мы передаём третий аргумент, то вернёт результат sum(1,2,3)
result == 6 // true
// При этом, мы можем в данном случае снова вызвать onePlusTwo, но уже с другим аргументом,
// и получим соответствующий результат:
onePlusTwo(7) // вернёт 10, так как onePlusTwo помнит 1+2, то есть получим sum(1,2,7) // 10.
onClick(event) {
let action = event.target.dataset.action;
if (action) {
this[action]();
}
}
_elem
кладётся elem это загадка. const el = document.createElement('div');
el.constructor.name // "HTMLDivElement"
class Habr {
constructor(q) {
this.q = q;
}
}
const h = new Habr('есть конструктор?');
h.constructor.name // "Habr"
Поэтому при вызове метода arr.filter() он внутри создаёт массив результатов, именно используя arr.constructor, а не обычный массив. Это замечательно, поскольку можно продолжать использовать методы PowerArray далее на результатах.
worker.slow()
оборачивается в новую функцию-декоратор. Декоратор выполняет некую работу, вызывает оригинальную функцию, с ее результатом может выполнить еще какую-то работу, и возвращает итоговый результат.worker.slow = cachingDecorator(worker.slow, hash);
worker.slow
у вас уже не оригинал, а декоратор. Т.е. эта функцияfunction() {
let key = hash(arguments); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, ...arguments); // (**)
cache.set(key, result);
return result;
};
arguments
.function cachingDecorator(func, hash) {
let cache = new Map();
return function(arg1, arg2) { // явно указать аргументы
let key = hash(arg1, arg2); // (*)
if (cache.has(key)) {
return cache.get(key);
}
let result = func.call(this, arg1, arg2); // (**)
cache.set(key, result);
return result;
};
}
worker {
slow: function(x) {
// this = worker
}
}
worker.slow = function(x) {
// this = worker
}
function test() {
// this = window;
}
worker.slow = test; // передали по ссылке, теперь this = worker
const resFunc = cachingDecorator(worker.slow); // вернул функцию function(x), this = window
worker.slow = resFunc; // передали по ссылке, this = worker
inArray()
возвращает ... ещё одну функцию, которую только что создала при вызове:function inArray(arr) {
const result = function(x) {
// внутри этой функции будет ещё и доступен
// arr, с которым вызвали inArray()
return arr.includes(x);
};
return result;
}
Т.е. вызов inArray()
с каким-то массивом возвращает всего лишь ещё одну функцию, которая принимает любой аргумент, но ещё и «запомнила» конкретный arr
, с которым её создали.const myFilter = inArray([1, 2, 10]);
это свежесозданная функция, которая для любого аргумента возвращает true/false — есть ли это же значение в массиве [1, 2, 10]