this是执行上下文中的一个属性,它指向最后一次调用这个方法的对象。在实际开发中,this的指向可以通过四种调用模式来判断。
- 第一种是函数调用模式,当一个函数不是一个对象的属性时,直接作为函数来调用时,this指向全局对象。
function globalContext() {
console.log(this); // 指向全局对象,如window(浏览器环境)或global(Node.js环境)
}
globalContext(); // 在全局作用域中调用函数
- 第二种是方法调用模式,如果一个函数作为一个对象的方法来调用时,this指向这个对象。
function functionContext() {
"use strict";
console.log(this); // 在严格模式下,指向undefined
}
functionContext(); // 普通函数调用
- 第三种是构造器调用模式,如果一个函数用new调用时,函数执行前会创建一个对象,this指向这个新创建的对象。
const obj = {
name: "John",
greet: function () {
console.log(this.name); // 指向调用该方法的对象obj的name属性
},
};
obj.greet(); // 方法调用
- 第四种是apply、call和bind调用模式,这三个方法都可以显示指定调用函数的this指向。其中apply()方法接受两个参数:一个是this绑定的对象,一个是参数数组。call()方法接收的参数,第一个也是this绑定的对象,后面的其余参数是传入函数执行的参数,也就是说,在使用call()方法时,传递给函数的参数必须逐个列举出来。bind()方法通过传入一个对象,返回一个this绑定了传入对象的新函数。这个函数的this指向除了使用new时会发生改变,其他情况下都不会改变。
这四种方式,使用构造器调用模式的优先级最高,然后是apply、call 和bind调用模式,然后是方法调用模式。