箭头函数无自有this,定义时静态捕获外层第一个普通函数的this值,且无法被call/apply/bind修改;普通函数的this由调用时上下文动态决定。

多层函数调用本身不会让 this “传播”或“继承”。this 的值在每次函数调用时**独立确定**,只取决于该次调用的上下文,和外层函数的 this 无关。
嵌套函数中的 this 不会自动沿用外层
即使一个普通函数写在外层方法内部,只要它是独立调用(没有绑定、没有点号调用),它的 this 就按默认规则处理,不会“记住”外层的 this。
- 外层对象方法中定义的内层函数,若直接调用(如
setTimeout(fn, 100)),this是undefined(严格模式)或window(非严格) - 这不是“丢失”,而是它本来就没被隐式/显式绑定——它就是一次普通调用
- 例如:
obj.run()中调用function inner() { console.log(this) },inner()的this和obj毫无关系
箭头函数是唯一能“捕获”外层 this 的方式
箭头函数不绑定自己的 this,而是沿词法作用域向上查找,取定义时所在函数的 this 值。
- 它不是“传播”,而是“静态捕获”:定义时外层的
this是什么,它就固定是什么 - 这个值不受后续调用方式影响,也无法被
call/apply/bind修改 - 常见用法:
obj.method = () => { console.log(this.name) }—— 这里的this继承自method定义时所在的上下文(比如类构造函数或模块顶层)
显式绑定可穿透多层,但仅限于你主动控制的那一次调用
call、apply、bind 只影响目标函数本次或后续调用的 this,不会改变其内部再调用其他函数的 this。
-
fn.call(obj)→fn内部的this是obj;但fn里再调用inner(),inner的this仍由它自己的调用方式决定 -
const bound = fn.bind(obj)→ 后续所有bound()调用,fn的this都是obj;但fn内部的普通子函数依然遵循默认规则
new 调用只影响构造函数本身,不影响其内部函数
用 new 调用时,this 绑定到新实例,仅作用于该构造函数体;它内部定义或调用的普通函数,仍按各自调用方式决定 this。
-
class C { constructor() { this.x = 1; setTimeout(() => console.log(this.x), 0) } }→ 箭头函数能访问this.x,是因为它捕获了构造函数的this - 但如果写成
setTimeout(function() { console.log(this.x) }, 0),里面的this就是undefined或window,和实例无关

















