А с третьей стороны, каррирование это что-то из «чистого функционального программирования» так что за использование тут this нужно просто бить по рукам =)
function ff(a, b, c) {
console.log(this, a, b, c);
}
const c1 = curry(ff);
c1('aa').call([1])('bb').call([2], 'cc')
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
}
const that = this; // this thing was missed
return function continueCurrying(...args2) {
const realThis = that === window || that === undefined ? this : that;
return curried.apply(realThis, args.concat(args2));
};
};
}
// с поддержкой this
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args)
}
return function continueCurrying(...args2) {
return curried.apply(this, args.concat(args2))
}
}
}
// без поддержки this
function curry2(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func(...args)
}
return function continueCurrying(...args2) {
return curried(...args, ...args2)
}
}
}
function ff(a) {
console.log(this, a);
}
const c1 = curry(ff);
const c2 = curry2(ff);
c1.call(['this'], 'a'); // в консоли: ['this'], 'a'
c2.call(['this'], 'a'); // в консоли: window, 'a'
def fib(n, a):
if (n < 1):
a[0] = 0
a[1] = 1
else:
m = n // 2
fib(m, a)
x = a[0] * (2 * a[1] - a[0])
y = a[0] * a[0] + a[1] * a[1]
if (n % 2):
a[0] = y
a[1] = x + y
else:
a[0] = x
a[1] = y
return a
def sumFib3n(n):
if (n < 1):
return 0
arr = [0, 0]
[fn, fnp1] = fib(n, arr)
fnm1 = fnp1 - fn
sgn = 1 if n % 2 else -1
sumPow3 = (fn * fnp1 * fnp1 + sgn * fnm1 + 1) // 2
return sumPow3 - 1 + fn * fn * fn + fnp1 * fnp1 * fnp1
print(sumFib3n((40000000 - 2)//3))
оно именно так через дженерик тут и описано?
interface ChangeEvent<T = Element> extends SyntheticEvent<T> {
target: EventTarget & T;
}
Просто у каждого HTML элемента свои свойства, как их event объединяет?