delay() создаёт обёртку над функцией, чтобы выполнить её через какое-то время. При этом старается ничего не сломать – передать все аргументы и сохранить контекст (
this) вызова. На всякий случай.
Распутывайте задом наперёд.
f.apply(context, ...) (
документация) – вызовет копию функции
f() с привязанным к ней контекстом
context. Тут так сделали, чтобы наверняка передать контекст. Тот
this, что был при вызове
delay(), благополучно окажется и у вызываемой через паузу функции.
А дальше смотрите как используют этот
delay() – и вспоминайте про
this у функций.
Почему бы не наделать тестов:
function delay(f, ms = 500) {
return function d() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
// функция для испытаний, будет выводить this
function testThis(msg) {console.log(msg, this);}
// Test 1
delay(testThis)("Test1"); // Window
// Test 2
const obj = {
title: 'test 2',
method: delay(testThis),
};
obj.method("Test 2"); // obj {title: 'test 2', method: d()}
// Test 3
const test3 = delay(testThis).bind({title: 'test 3'});
test3("Test 3"); // Object {title: 'test 3'}
// Test 4
const maker = delay(testThis);
const M = new maker('Test 4'); // Object { }