this 指向运行时调用函数的对象,由调用方式决定:普通调用指向全局对象,对象方法调用指向点号左侧对象,箭头函数继承外层this,call/apply/bind可显式绑定,构造函数中指向新实例。

this 指向当前执行上下文中的“调用者对象”,不是定义时决定的,而是运行时根据函数如何被调用动态确定的。它不绑定函数本身,也不由作用域决定,只看函数调用的“方式”。
普通函数调用(非严格模式)
直接调用函数(如 fn()),this 指向全局对象(浏览器中是 window,Node.js 中是 global)。
- 即使函数在对象方法内部定义,只要单独调用,this 就丢失绑定
- 常见陷阱:把对象方法赋值给变量后再调用,this 不再指向原对象
对象方法调用
当函数作为对象的属性被调用(如 obj.method()),this 指向该对象(即点号左边的对象)。
- 只看调用时的“最近一层点”:嵌套对象中,
obj.inner.fn()的 this 指向inner - 箭头函数不遵循此规则——它没有自己的 this,会沿作用域链向上找外层普通函数的 this
构造函数与 class 方法
用 new 调用函数时,this 指向新创建的实例;class 中的普通方法,默认 this 指向实例(但需注意绑定问题)。
立即学习“Java免费学习笔记(深入)”;
- class 构造器中,this 是即将返回的新对象
- class 方法若被解构或传参(如
setTimeout(obj.fn, 100)),this 会丢失,需手动绑定(bind、箭头函数或事件处理器中用handleClick = () => {})
call / apply / bind 和箭头函数
call、apply、bind 可显式指定 this 值;而箭头函数的 this 是词法继承的,声明时就固定,无法被任何调用方式或 bind 改变。
-
bind返回的新函数,this 被永久锁定,后续call也无法覆盖 - 箭头函数适合用在回调中避免 this 丢失,比如
arr.map(x => this.name)
基本上就这些。理解 this 的关键是盯住“谁在调用”,而不是“谁定义了它”。











