this指向取决于函数调用方式:普通调用时指向全局对象或undefined;对象方法调用时指向点号左边的对象;new调用时指向新实例;call/apply/bind可显式绑定this,优先级最高;箭头函数无this,继承外层词法作用域。

this 指向谁,不看函数怎么定义,只看它**怎么被调用**。记不住规则?直接看调用位置的“点左边是谁”或“有没有被 call/apply/bind 修改”——绝大多数情况够用了。
普通函数调用时,this 指向全局对象(非严格模式)或 undefined(严格模式)
这是最容易踩坑的场景:函数单独执行,没挂对象、没用 new、没 bind。
常见错误现象:setTimeout 里 this 丢失、事件回调里 this 不是预期 DOM 元素、普通工具函数里误用 this。
- 非严格模式下,
foo()中的this是window(浏览器)或global(Node.js) - 严格模式下,
this是undefined,访问this.xxx会直接报TypeError - ES6 模块顶层的函数默认处于严格模式,所以
this几乎总是undefined
示例:
立即学习“Java免费学习笔记(深入)”;
function say() {
console.log(this); // 严格模式 → undefined;非严格 → window
}
say();
对象方法调用时,this 指向调用它的那个对象
关键看“点号左边”的引用值,不是对象字面量本身,也不是原型链上的对象。
使用场景:对象方法、Vue/React 组件方法(未绑定时)、DOM 事件监听器(如果用 obj.handleClick 形式传入)。
-
obj.method()→this是obj -
const fn = obj.method; fn()→this已丢失,退化为上一条规则 -
obj.method.call(other)→this被强行改成other,覆盖默认行为
注意:箭头函数没有自己的 this,它继承外层作用域的 this 值,所以 obj.arrowMethod() 的 this 取决于箭头函数定义时的上下文,而非调用时。
构造函数调用(new)时,this 指向新创建的实例
只要函数被 new 调用,this 就绑定为新对象,且无法被 call/apply 改写(除非返回非空对象)。
-
new Foo()→this是一个空对象,原型指向Foo.prototype - 如果构造函数显式
return一个对象,则this实例被丢弃,返回该对象;返回原始值(string/number/etc)则忽略,仍返回新实例 - 箭头函数不能用
new,会直接报TypeError: xxx is not a constructor
call/apply/bind 显式绑定时,this 指向传入的第一个参数
它们是唯一能“强行指定” this 的方式,优先级高于隐式绑定(即点号调用)。
-
fn.call(obj, a, b)→this是obj,参数逐个传 -
fn.apply(obj, [a, b])→this是obj,参数以数组传 -
const bound = fn.bind(obj, a)→ 返回新函数,this永远是obj,且预置第一个参数a - 多次
bind无效:只有第一次生效;bind后再call也无法覆盖已绑定的this
容易被忽略的是:即使原函数是箭头函数,bind 也不能改变它的 this —— 因为箭头函数的 this 是词法绑定、不可重写。











