为什么 this 没有指向我所声明的对象?
“为什么 this 没指向我所声明的这个对象,JavaScript 的 this 难道不是指向一个对象吗?”
this 确实是一直指向一个对象的,而具体指向哪个对象是要看它所在的执行环境,而非它被声明时的环境。
一般情况下,this 的指向可以分为四种类型:
- 作为对象的方法调用
- 作为普通函数调用
- 构造器调用
- func.prototype.call && func.prototype.apply
一、作为对象的方法调用:
当作为调用者(对象)的方法被调用时,则 this 指向这个调用者。
举个例子:
const student = {
name: 'A',
greet: function () {
alert(`hello,I am ${this.name}`)
}
}
student.greet() // hello, I am A
二、作为普通函数调用:
普通函数的 this 总是指向全局对象,而在浏览器中的 JavaScript,其全局对象就是 window 对象。
举个例子:
window.name = 'B'
const getName = function () {
console.log(this.name)
}
getName() // B
三、构造器调用:
在 JavaScript 是没有类的,只不过我们可以使用构造器创建对象,并且在 new 运算符的作用下,使得构造器看起来更像是一个类。 构造器跟前面提及的普通函数从外观上来看相同,但是,两者的调用方式截然不同,在使用 new 运算符调用函数时,该函数返回一个对象,那么在构造器中的 this 指向就是返回的这个对象。
举个例子:
const Person = function () {
this.name = 'C'
}
const student = new Person()
console.log(student.name) // C
有时候,事实并不是我们想象的那么美好,假如构造器显式地返回一个 obj 类型的对象,那么,我们上面所期待的结果将变成这个被返回来的 obj 对象。
举个例子:
const Person = function () {
this.name = 'C'
return {
name: 'D'
}
}
const student = new Person()
console.log(student.name) // D
有 obj 类型的对象,也有可能返回的是一个非对象类型的数据,如字符串,那么,这种情况下,不会影响 this 的正常指向。

浙公网安备 33010602011771号