Что здесь применяется в качестве значения this?

Код:

function delay(f, ms) {
return function d() {
    setTimeout(() => f.apply(this, arguments), ms);
};
}

let f1000 = delay(alert, 1000);
f1000("test");

На этой строчке, что применяется в качестве this и для чего оно здесь вообще?

setTimeout(() => f.apply(this, arguments), ms);
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
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 { }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы