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 { }