gpt4 book ai didi

javascript - 在 Javascript apply 中使用 'this' 作为函数

转载 作者:行者123 更新时间:2023-11-29 20:41:59 26 4
gpt4 key购买 nike

    Function.prototype.defer = function(ms) {
let f = this
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

所以上面的代码给出了一个错误“this.apply is not a function”。但是,如果我将带有 (**) 的行更改为

setTimeout(()=>f.apply(this, args), ms);

代码运行良好,即使 f 仍然引用“this”。是什么赋予了?

最佳答案

让我们看一下问题中提供的代码,看看为什么有效,以及另一个没有。

让我们先来看看功能示例:

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 是一个对象而不是一个函数,这就解释了你的错误得到。

关于javascript - 在 Javascript apply 中使用 'this' 作为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55195400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com