箭头函数不绑定this,继承词法作用域且不可被call/apply/bind修改;显式绑定仅对普通函数有效,可强制覆盖运行时this,优先级高于隐式绑定,且bind后的函数仍支持new调用。
箭头函数和显式绑定(call/apply/bind)在 JavaScript 中看似都“影响 this”,但本质完全不同:前者不绑定 this,只继承词法作用域;后者强制覆盖运行时 this,属于动态干预。它们在不同 JS 特性中表现差异明显,关键看是否涉及上下文重置或调用控制。
箭头函数没有自己的 this 绑定,它的 this 值在定义时就确定,并沿作用域链向上查找,之后完全固定。
call(obj, ...)、apply(obj, [...]) 或 bind(obj),this 仍保持原值,不会变成传入的对象bind 修复事件回调中的 this,却用了箭头函数——实际根本没生效,因为本就不需要修const obj = { name: 'Alice' };<br>const arrow = () => console.log(this.name);<br>arrow.call({ name: 'Bob' }); // 仍输出全局 name 或 undefined,不是 'Bob'
只有具备自身 this 绑定能力的函数(即普通函数),才能被 call、apply、bind 改变执行上下文。
call 和 apply 立即执行,第一个参数就是新的 this;bind 返回新函数,this 被“硬绑定”,后续无法再通过其他绑定方法覆盖obj.fn()),所以 obj.fn.call(otherObj) 的 this 是 otherObj,不是 obj
null 或 undefined 作 this 参数时,非严格模式下会自动替换为全局对象两者解决的是同一类问题(this 丢失),但路径相反:
btn.addEventListener('click', this.handleClick)),隐式绑定失效 → this 指向事件目标或全局 → 此时可用 bind(this) 显式修复,或改用箭头函数写法(handleClick = () => { ... })自动继承类实例的 thisobj1.method.call(obj2))——它根本不支持这种调用setTimeout、Promise.then)内部若需访问外层 this,箭头函数天然适用;而普通函数必须靠显式绑定或闭包变量保存 this这是二者不可逾越的分水岭:
new arrowFn() 会直接报错(TypeError: arrowFn is not a constructor),因为它没有 prototype,也不支持 new 绑定bind)返回的 bound 函数,如果原函数是构造函数,则 new boundFn() 仍可正常工作,this 指向新实例,不受之前 bind 的影响(这是 bind 的特殊设计)