javascript函数调用有四种模式:1.方法调用时this指向调用对象;2.函数调用时非严格模式this为全局对象,严格模式为undefined;3.构造调用时this指向新实例;4.显式调用时通过call/apply/bind指定this。

JavaScript中函数调用的四种模式
JavaScript中函数的this值不是由函数定义决定的,而是由**调用方式**决定的。共存在四种标准调用模式,每种对应不同的this绑定规则:
1. 方法调用模式(Method Invocation)
当函数作为对象的属性被调用时,this指向该对象。
const obj = {
name: 'Alice',
greet() {
console.log(this.name); // 'Alice'
}
};
obj.greet(); // this → obj
2. 函数调用模式(Function Invocation)
独立调用函数(非对象属性、非new、非call/apply/bind),在非严格模式下this指向全局对象(浏览器中为window),严格模式下为undefined。
function foo() {
console.log(this);
}
foo(); // 非严格:window;严格:undefined
3. 构造器调用模式(Constructor Invocation)
使用new关键字调用函数时,会创建新对象,this绑定到该新实例。
function Person(name) {
this.name = name;
}
const p = new Person('Bob'); // this → 新建的p实例
4. 显式调用模式(Explicit Invocation)
通过.call()、.apply()或.bind()手动指定this值。
function log() {
console.log(this.role);
}
const user = { role: 'admin' };
log.call(user); // 'admin'
log.apply(user); // 'admin'
log.bind(user)(); // 'admin'
this绑定优先级顺序
当多种绑定方式共存时,this取值遵循明确的优先级,从高到低如下:
-
new 绑定:使用
new调用时,无论是否用bind预设过this,最终this都指向新创建的实例(bind返回的函数被new调用时,原绑定被忽略) -
显式绑定:包括
call、apply、bind。其中call/apply在运行时立即生效,bind生成永久绑定函数(但可被new覆盖) -
隐式绑定(方法调用):对象.方法() 形式,
this指向调用者对象。若存在多层嵌套(如obj.fn()),只看最直接的调用对象 -
默认绑定(函数调用):以上都不满足时触发。严格模式为
undefined,非严格模式为全局对象
注意:箭头函数不遵循上述任何规则——它没有自己的this,始终继承外层普通函数作用域的this值(词法绑定),因此不参与该优先级表。
常见陷阱与验证技巧
理解优先级的关键在于“谁最终执行了函数”以及“以什么方式执行”。可借助以下方式快速判断:
- 先看是否含
new:有则this为新实例,其余绑定失效 - 再看是否用
call/apply/bind:有则按传入对象绑定(除非被new覆盖) - 接着看调用形式:是否为
obj.method()?是则this为obj - 最后 fallback 到默认绑定
调试时可在函数内打印console.log(this),或用console.log(this.constructor.name)辅助识别对象类型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











