this指向由调用方式决定,遵循new>显式>隐式>默认四条绑定规则,箭头函数不适用规则而继承外层this。

函数内部的 this 指向不是看它在哪定义,而是看它怎么被调用。掌握四条核心绑定规则,就能在绝大多数场景中准确判断 this 值。
默认绑定:独立调用时指向全局或 undefined
当函数以简单方式调用(如 foo()),且未处于严格模式时,this 指向全局对象(浏览器中为 window);严格模式下则为 undefined。箭头函数不适用此规则——它没有自己的 this,直接继承外层作用域的 this 值。
- 普通函数独立调用 → 看是否严格模式
- 箭头函数 → 忽略所有绑定规则,沿作用域链向上找 this
- 注意:类方法若被赋值给变量后调用,就属于默认绑定
隐式绑定:调用位置带对象前缀
当函数作为对象属性被调用(如 obj.method()),this 指向该对象(即点号左边的对象)。但只看**最后一次点号前的对象**,嵌套调用中不会追溯更外层。
-
obj.inner.obj2.method()→ this 是obj2,不是obj - 隐式绑定会被显式绑定或 new 绑定覆盖
- 回调函数传入时(如
setTimeout(obj.foo, 100))会丢失隐式绑定,变成默认绑定
显式绑定:call / apply / bind 强制指定 this
使用 call、apply 或 bind 可明确设置函数运行时的 this 值。其中 bind 返回新函数,后续调用仍保持绑定;而 call 和 apply 是立即执行。
-
fn.call(obj, a, b)→ this 为obj -
fn.bind(obj)(a, b)→ 同样绑定obj,但延迟执行 - 硬绑定函数无法被 new 覆盖(new 时仍会忽略绑定,但返回新实例)
new 绑定:构造函数调用创建新对象
用 new 调用函数时,引擎会自动创建空对象,将其作为 this 并关联原型,最后隐式返回该对象(除非手动 return 一个对象)。
- 必须是函数声明/表达式,不能是箭头函数(语法报错)
- new 绑定优先级最高,高于显式绑定和隐式绑定
- 若构造函数 return 了非 null 对象,则 this 绑定失效,返回该对象
四条规则按优先级排序:new > 显式 > 隐式 > 默认。实际判断时,先看是否 new 调用,再看是否有 call/apply/bind,接着看是否对象.方法调用,最后回落到默认绑定。箭头函数单独处理,跳过全部规则。


















