Давайте посмотрим на код, приведенный в вопросе, чтобы понять, почему один работает, а другой нет.
Давайте сначала посмотрим на работающий пример:
Function.prototype.defer = function (ms) {
let f = this;
return function(...args) {
setTimeout(() => f.apply(this, args), ms);
};
};
function f(a, b) {
alert(a + b);
}
f.defer(1000)(1, 2); // shows 3 after 1 second
// translates to
setTimeout(() => f.appy(this, [1, 2]), 1000);
// ^
// here `this` refers to the global object (window)
Давайте посмотрим на нерабочий пример:
Function.prototype.defer = function (ms) {
return function(...args) {
setTimeout(() => this.apply(this, args), ms);
};
};
function f(a, b) {
alert(a + b);
}
f.defer(1000)(1, 2); // shows 3 after 1 second
// translates to
setTimeout(() => this.appy(this, [1, 2]), 1000);
// ^ ^
// here `this` refers to the global object (window)
Поскольку this
в вышеприведенном контексте указывает наглобальный объект (окно), вы также можете написать это как:
setTimeout(() => window.appy(window, [1, 2]), 1000);
Поскольку window
является объектом, а не функцией, это объясняет ошибку, которую вы получаете.