this指向仅由调用方式决定,与作用域链无关;四种绑定规则(默认、隐式、显式、new)均取决于调用形式,箭头函数则继承最近非箭头函数的this绑定结果。

作用域链和 this 完全无关,不能靠作用域链判断 this 指向。this 的值只由函数的调用方式决定,和函数定义在哪、嵌套多深、变量在哪里声明都没关系。
作用域链管“找变量”,this 管“谁在调用”
作用域链解决的是标识符(比如 a、foo)从哪一层作用域里取值;而 this 解决的是函数执行时,“当前上下文对象”是谁。两者运行机制不同、查找路径不同、目的也不同。
- inner 函数能访问 outer 的变量,靠的是作用域链向上查找
- inner 函数里的 this 是什么,取决于 inner 被谁调用,不是 outer 的 this 或 outer 的作用域
- 哪怕函数写在对象方法内部,只要它被单独拿出来调用,this 就会丢失,跟外层作用域毫无关系
四种绑定规则完全独立于作用域
每种绑定都只看调用形式,不看函数写在哪:
- 默认绑定:函数直接调用,如 foo() → this 指向全局(非严格模式)或 undefined(严格模式)
- 隐式绑定:带对象前缀调用,如 obj.fn() → this 指向 obj,不管 fn 是在全局定义还是在另一个函数里定义
- 显式绑定:用 call/apply/bind 显式传入对象 → this 就是那个传入的对象,作用域链不影响结果
- new 绑定:用 new Fn() 调用 → this 指向新创建的实例,与构造函数所在的作用域无关
箭头函数是唯一和词法有关的例外
箭头函数没有自己的 this,它继承外层普通函数执行时的 this 值——注意,不是继承外层作用域的变量,而是继承外层函数调用时已确定的 this 绑定结果。
- 这个“外层”指的是**紧邻的、最近的非箭头函数**,不是任意上层作用域
- 如果外层函数本身是默认绑定(如直接调用),那箭头函数的 this 就是 window 或 undefined
- 如果外层函数是隐式绑定(如 obj.method()),那箭头函数的 this 就是 obj
实际调试时只需盯住调用位置
判断 this 最可靠的方法,是找到函数被调用的那一行代码,看它前面有没有对象、有没有 call/apply/bind、有没有 new,而不是去翻它的定义位置或闭包链。
- obj.handleClick() → 隐式绑定,this 是 obj
- setTimeout(obj.handleClick, 100) → 默认绑定,this 是全局(或 undefined)
- setTimeout(() => obj.handleClick(), 100) → 箭头函数继承外层 this,但 handleClick 仍是 obj 调用,所以 this 还是 obj

















