箭头函数的 this 不能被修改,它继承外层普通函数作用域中静态、词法绑定的 this 值,与调用方式无关;call、apply、bind 及对象方法调用均无效。

箭头函数内的 this 绑定**不能被修改**。它没有自己的 this,而是继承外层普通函数作用域中的 this 值,且该绑定是静态的、词法的,与调用方式无关。
箭头函数的 this 是词法绑定
箭头函数不创建自己的 this,而是从定义时所在的外层作用域“捕获” this 值。这个值在函数创建时就已确定,之后无论怎么调用(如通过 call、apply、bind 或作为对象方法调用),都无法改变它。
-
call()、apply()、bind()对箭头函数的this完全无效 - 即使把箭头函数赋给另一个对象并调用,
this仍指向原始定义时的上下文 - 在全局作用域中定义的箭头函数,其
this指向全局对象(非严格模式)或undefined(严格模式)
对比普通函数的 this 行为
普通函数的 this 是动态绑定的,取决于调用方式;而箭头函数没有这种灵活性:
- 普通函数:可通过
obj.fn()、fn.call(obj)、fn.bind(obj)改变this - 箭头函数:所有这些操作都不会影响它的
this,它始终沿用外层函数的this - 如果外层没有普通函数(比如直接在全局或模块顶层),则
this取决于执行环境
常见误用场景与规避建议
容易误以为能用 bind 给箭头函数绑定 this,结果发现无效:
- 错误写法:
const fn = () => { console.log(this); }; fn.bind(obj)();——this不会变成obj - 正确做法:若需动态
this,改用普通函数;若需固定上下文,确保箭头函数定义在外层已有明确this的函数内(如类方法、事件回调等) - React 类组件中常用箭头函数写法(
handleClick = () => {...})正是利用了这一点:自动绑定到组件实例,避免手动bind(this)
如何确认箭头函数的 this 来源
只需看它**在哪里被定义**,而不是在哪里被调用:
- 打开开发者工具,在箭头函数内部打 debugger,查看
this值,并回溯外层函数的this - 注意:ES6 模块顶层、IIFE 外部、class 字段初始化等位置,可能没有可继承的
this,此时要特别留意运行环境 - 必要时可用普通函数 + 显式绑定,或用闭包变量暂存需要的上下文(如
const self = this;)











