JavaScript中this指向函数调用时的执行上下文对象,取决于五种调用方式:普通调用(严格模式为undefined,否则为全局对象)、对象方法调用(指向点号左侧对象)、call/apply/bind显式绑定、箭头函数(继承外层this)、构造函数调用(指向新实例)。

JavaScript 中的 this 不是指向函数本身,也不是定义时的作用域,而是**函数被调用时的执行上下文对象**。准确判断 this 的值,关键看函数**怎么被调用**,而不是怎么被定义。
普通函数调用(非严格模式 vs 严格模式)
直接调用函数(如 fn()),this 的指向取决于是否启用严格模式:
对象方法调用(最常见场景)
当函数作为对象的属性被调用时(如 obj.method()),this 指向该对象(即点号左边的对象):
const obj = { name: 'Alice', say() { console.log(this.name); } }; obj.say(); // 'Alice'- 注意:如果把方法赋值给变量再调用(
const f = obj.say; f();),就变成普通调用,this 不再是obj
call、apply、bind 显式绑定
这三个方法可强制指定 this 值:
立即学习“Java免费学习笔记(深入)”;
-
fn.call(obj, arg1, arg2)和fn.apply(obj, [arg1, arg2])立即执行,this 为obj -
fn.bind(obj)返回新函数,新函数无论怎么调用,this 都固定为obj - bind 优先级高于 call/apply?不,但多次 bind 无效;而 call/apply 在调用时可覆盖 bind 的绑定(除非是箭头函数)
箭头函数没有自己的 this
箭头函数不绑定 this,它会沿作用域链向上查找外层普通函数的 this 值:
- 不能用
call/apply/bind改变其 this - 常用于事件回调、定时器等避免 this 丢失的场景,例如:
setTimeout(() => console.log(this.val), 100);
构造函数调用(new 关键字)
使用 new 调用函数时,this 指向新创建的实例对象:
-
function Person(name) { this.name = name; } const p = new Person('Bob');→ this 是p - 箭头函数不能作为构造函数,调用
new会报错
掌握这五种调用方式及其优先级(new > 显式绑定 > 对象方法 > 普通调用),再结合箭头函数的特殊性,就能稳定预测 this 的值。实际开发中,遇到 this 不对,先看函数是怎么被调用的,再往上追溯绑定逻辑。










