You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:JavaScript代码示例中‘this’关键字的指代对象

关于Function.prototype.defer中this的指向问题

嘿,这个问题问到点子上了——this在原型方法里的指向确实是JavaScript里容易绕晕的点,我来给你讲明白!

首先得回忆下JavaScript里this的核心绑定规则:当你以对象.方法()的形式调用方法时,this就指向那个调用方法的对象。

那回到你看到的这段代码:

Function.prototype.defer = function(ms) {
  let f = this; // 这里的this就是关键
  return function(...args) {
    setTimeout(() => f.apply(this, args), ms);
  };
};

因为defer是挂载在Function.prototype上的方法,所以所有函数都能调用这个defer方法。这时候,defer内部的this,就指代的是调用defer的那个函数本身。

举个具体的例子你就懂了:

// 定义一个普通函数
function greet() {
  console.log(`Hello from ${this.name}`);
}

// 给这个函数绑定一个上下文
const person = { name: "Darren" };
const boundGreet = greet.bind(person);

// 调用defer方法
boundGreet.defer(1000)();

在boundGreet.defer(1000)这一步,defer方法里的this就是boundGreet这个函数对象。代码里把this存到f变量里,是为了避免后面定时器回调里的this指向变化(如果用普通函数做回调,this会指向全局对象或者undefined),这样就能确保定时器触发时,我们调用的是原来的那个函数。

再结合你熟悉的构造函数例子:

function Dog(name) {
  this.name = name;
}
Dog.prototype.bark = function() {
  console.log(`${this.name} woofs!`);
};

const fido = new Dog("Fido");
// 延迟1秒执行bark
fido.bark.defer(1000)();

这里调用fido.bark.defer(1000)时,defer里的this就是fido.bark(也就是Dog原型上的bark函数),保存到f后,定时器触发时就会正确调用这个bark函数,并且通过apply把上下文绑定到正确的对象上(这里内部返回函数的this在调用时是全局,但apply可以传递我们需要的上下文,不过这是额外的细节了)。

总结一下:Function.prototype.defer里的this,就是你要延迟执行的那个函数对象本身——谁调用了defer,this就指向谁。

内容的提问来源于stack exchange,提问作者DarrenF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:54:39