javascript中this指向由调用方式动态决定:1. new调用优先,this指向新实例;2. 显式绑定(call/apply/bind)次之;3. 对象方法调用时指向点号左侧对象;4. 独立调用时非严格模式为window/global,严格模式为undefined;5. 箭头函数无this,继承外层普通函数的this。

判断 JavaScript 中 this 指向,核心就一句话:看函数怎么被调用,而不是在哪定义。它不固定,只在执行时动态确定,关键取决于调用形式和上下文环境。
先看是不是 new 调用
这是最高优先级。只要函数前面加了 new,this 一定指向新创建的实例对象,其他所有绑定方式都会被忽略。
-
new Person()→this是新Person实例 - 即使函数已用
bind绑定过,new仍会覆盖它 - 箭头函数不能被
new调用,会直接报错
再看有没有 call/apply/bind
显式绑定次之。只要用了 fn.call(obj)、fn.apply(obj) 或 fn.bind(obj),this 就是传入的第一个参数(obj)。
-
fn.call({x: 1})→this是{x: 1} -
bind返回的新函数,this已固化,后续再用call也无法更改(除非再new)
接着看是不是对象方法调用
也就是形如 obj.method() 这种带点号的调用。此时 this 指向“点号左边最近的那个对象”。
-
user.profile.getInfo()→this是profile,不是user - 一旦脱离点调用,比如
const fn = obj.method; fn(),就会退回到默认绑定 - 解构赋值、作为回调传入(如
setTimeout(obj.fn, 100))、数组取值等,都会导致隐式绑定丢失
最后看是否独立调用
既没 new、也没显式绑定、也没点号调用,就是默认绑定——这是兜底规则。
- 非严格模式下:
this是window(浏览器)或global(Node) - 严格模式下:
this是undefined - ES6 模块顶层代码自动启用严格模式,所以模块中普通函数独立调用时
this总是undefined
特别注意箭头函数
箭头函数没有自己的 this,它不参与以上四条规则,而是继承外层第一个普通函数的 this 值。
- 写在全局:继承全局上下文的
this(通常是window或undefined) - 写在普通函数内:和该函数的
this一致 - 无法用
call/apply/bind改变它的this - 类字段中用箭头函数定义方法(如
handleClick = () => {}),this并不指向实例,因为类体顶层不是函数作用域
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











