this指向
2024-02-08 21:14:03 # javascript

先看两段代码,分析各自的输出结果

1
2
3
4
5
6
7
8
9
10
name = "Jerry";
var object = {
name: "Tom",
getFunc: function() {
return function() {
console.log(this.name);
}
}
}
object.getFunc()();
1
2
3
4
5
6
7
8
9
10
11
name = "Jerry";
var object = {
name: "Tom",
getFunc: function() {
let that = this;
return function() {
console.log(that.name);
}
}
}
object.getFunc()();

结果:

第一个输出Jerry,第二个输出Tom

这类问题可以简化为this的指向:

1
2
3
4
5
6
7
8
9
var object = {
getFunc: function() {
console.log("@1",this)
return function() {
console.log("@2",this);
}
}
}
object.getFunc()();

当调用object.getFunc()时,由于getNameFunc 是一个方法,当它被调用时,它的执行上下文(this)会绑定到对象 object,此时的@1处的this指向的是object。但在该方法内部,它返回了另一个函数,我们假设令该返回的函数名为f1,object.getFunc()执行后,再执行f1() , 由于该函数是在全局作用域下调用并执行的,所以@2处this指向window。

在上面最初的第二段代码中,用that保存了object中的this,所以在执行完后输出的是object中的name,也就是Tom;反观第一段代码,return出去的函数是在全局条件下调用执行的,所以this指向的是window,输出的也是window下的name,也就是Jerry了。