咨询: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
相关产品推荐
相关产品推荐

