JavaScript中函数的this值在调用时动态绑定,取决于四种模式:1.方法调用(this指向调用对象);2.函数调用(非严格模式为全局对象,严格模式为undefined);3.构造器调用(this指向新实例);4.显式绑定(call/apply/bind强制指定this),且优先级为new > 显式 > 隐式 > 默认,箭头函数无this,继承外层作用域。

函数调用模式决定this指向
JavaScript中函数的this值不是在函数定义时确定的,而是在**调用时**根据调用方式动态绑定。理解四种调用模式及其优先级,是掌握this行为的关键。
1. 方法调用模式(对象.方法())
当函数作为对象的属性被调用时,this指向该对象。
- 常见于对象字面量、原型方法、class实例方法
- 即使函数被赋值给变量,只要调用时带对象前缀,就属于此模式
例如:
const obj = { name: 'Alice', say() { console.log(this.name); } };<br>
obj.say(); // 'Alice' —— this 指向 obj
2. 函数调用模式(独立调用)
直接以fn()形式调用,不带任何对象前缀或new关键字。此时this绑定取决于是否启用严格模式:
- 非严格模式下,this指向全局对象(浏览器中为
window) - 严格模式下,this为
undefined
例如:
function foo() { console.log(this); }<br>
foo(); // 非严格:window;严格:undefined
3. 构造器调用模式(new fn())
使用new操作符调用函数时,会创建新对象,并将this绑定到该新实例上。
立即学习“Java免费学习笔记(深入)”;
- 函数内部自动返回该新对象(除非显式返回非null对象)
- 构造函数首字母通常大写,是约定而非强制
例如:
function Person(name) { this.name = name; }<br>
const p = new Person('Bob'); // this 指向新创建的 p 实例
4. 显式绑定模式(call / apply / bind)
通过fn.call(obj, ...)、fn.apply(obj, [...])或fn.bind(obj)强制指定this值。
-
call和apply立即执行,区别仅在于参数传入方式 -
bind返回新函数,this永久绑定,不可被后续调用覆盖 - 箭头函数没有自己的this,会沿作用域链向上查找,因此不受以上任何模式影响
this绑定优先级从高到低
当多种绑定方式共存时,优先级顺序如下(高 → 低):
- new 绑定:最高优先级,new 调用时无视其他绑定
- 显式绑定:call/apply/bind 可覆盖默认绑定,但若用bind绑定后又被new调用,则new生效
- 隐式绑定(方法调用):obj.method() 中的this指向obj,但若被赋值后调用则降级为普通调用
- 默认绑定:独立调用时的兜底规则,优先级最低
注意:箭头函数不参与该优先级体系,它的this由外层函数作用域决定,且不可更改。










