普通函数直接调用时,非严格模式下this指向全局对象(浏览器window/Node.js global),严格模式下为undefined;对象方法调用时this指向点号左侧对象;call/apply/bind可显式绑定this;箭头函数无this,继承外层词法作用域this。

普通函数调用时的 this 指向
直接执行一个函数(比如 foo()),this 在非严格模式下指向全局对象(浏览器中是 window,Node.js 中是 global);严格模式下为 undefined。
- 容易踩的坑:在事件回调或定时器里直接传入普通函数,
this会丢失绑定,比如setTimeout(obj.method, 100)中的method内部this不再是obj - 验证方式:在函数开头加
console.log(this),观察输出值 - 注意箭头函数不适用此规则——它没有自己的
this,而是继承外层作用域的this
对象方法调用时的 this 绑定
当函数作为对象属性被调用(obj.method()),this 指向该对象(即点号左边的对象)。
- 只看调用时的「点左边是谁」,和函数定义在哪无关。例如把
obj.method赋给变量后再调用:const fn = obj.method; fn()→ 此时已退化为普通调用,this不再是obj - 嵌套对象也一样:
obj.inner.nested()中的this是obj.inner,不是obj - getter/setter 中的
this同样遵循该规则,指向触发 getter 的那个对象
call、apply 和 bind 如何显式控制 this
这三个方法都用于手动指定函数运行时的 this 值。
-
func.call(obj, arg1, arg2):立即执行,this设为obj -
func.apply(obj, [arg1, arg2]):同上,参数以数组形式传入 -
func.bind(obj):返回一个新函数,该函数永久绑定this为obj,即使后续再用call也无法覆盖(除非用new) - 注意:
bind两次不会叠加,第二次绑定无效;new调用绑定函数时,this会被新实例覆盖,忽略原绑定
箭头函数与 this 的特殊性
箭头函数不绑定 this,它直接沿用定义时所在词法作用域的 this 值,且无法通过 call/apply/bind 修改。
立即学习“Java免费学习笔记(深入)”;
- 常见误用:在对象方法中写箭头函数想访问对象属性,结果
this指向外层(比如构造函数或模块顶层),导致this.xxx为undefined - 适合场景:回调函数中需要保持外层
this,如arr.map(x => this.handle(x)),避免手动bind或缓存const self = this - 不能用作构造函数:调用
new箭头函数会报错TypeError: xxx is not a constructor
this 隐式丢失。别依赖记忆规则,遇到不确定就加一行 console.log(this) 看一眼。











