this的值由调用方式动态决定:普通调用指向全局对象或undefined;对象方法调用指向该对象;call/apply/bind可显式绑定;箭头函数无this,继承外层词法作用域。

在函数调用模式下,this 的值由“谁调用该函数”决定,而非函数定义的位置或方式。它不绑定函数本身,而是在函数执行时动态绑定,且默认指向全局对象(非严格模式)或 undefined(严格模式)。
普通函数直接调用时的 this
当函数被单独调用(无任何上下文对象),this 指向全局对象:
- 浏览器中为 window(非严格模式)
- Node.js 中为 global
- 开启严格模式后,直接调用时 this 是 undefined
例如:function foo() { console.log(this); } foo(); —— 输出 window 或 undefined,取决于是否启用严格模式。
作为对象方法调用时的 this
当函数作为对象的属性被调用,this 指向该对象(即“点号左边的对象”):
- obj.method() → this 指向 obj
- 即使方法被赋值给变量再调用,也会丢失绑定:const fn = obj.method; fn(); 此时已退化为普通调用,this 不再是 obj
call、apply 和 bind 显式控制 this
这三个方法允许你手动指定函数运行时的 this 值:
- func.call(obj, a, b):立即执行,this 绑定为 obj
- func.apply(obj, [a, b]):同上,参数以数组形式传入
- func.bind(obj):返回新函数,this 永久绑定为 obj(后续调用不可覆盖)
箭头函数没有自己的 this
箭头函数不创建自己的 this,而是继承外层作用域(词法作用域)的 this 值:
- 它无视 call、apply、bind 对 this 的修改
- 在对象方法中使用箭头函数,this 不会指向该对象,而是指向定义时所在上下文(如外层函数或全局)
因此,不要用箭头函数替代需要动态 this 绑定的方法(比如事件回调中需访问实例属性时,应谨慎选择)。











