不能。bind 创建的函数,其 this 在绑定时就已固化,后续任何方式(包括 call、apply、再次 bind 或赋值调用)都无法修改;唯一例外是 new 调用时 this 指向新实例。

不能。bind 创建的函数,其 this 在绑定时就已固化,后续任何方式都无法修改它。
bind 的 this 是硬编码的,不是“默认值”
bind 返回的新函数内部,this 不是可被覆盖的运行时配置,而是直接写死在函数执行逻辑里的引用。它不依赖调用方式,也不响应 call/apply —— 这些方法对它完全无效。
- 即使你对 boundFn 调用
boundFn.call(obj2)或boundFn.apply(obj3),输出仍是最初 bind 的对象 - 把 boundFn 赋值给另一个对象的属性再调用,this 依然不变
- 放在 setTimeout、事件监听器或作为回调传入,this 也始终如一
多次 bind 对 this 没有叠加或覆盖效果
链式调用 fn.bind(a).bind(b).bind(c) 中,只有第一次的 a 生效;b 和 c 被忽略。这不是 bug,而是规范强制行为。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- ECMAScript 规定 bind 函数拥有内部槽位
[[BoundThis]],仅初始化一次 - 后续 bind 只会合并预设参数(arg1, arg2…),但不会重置
[[BoundThis]] - 想换 this?只能放弃这个 boundFn,重新用原始函数调用 bind 或 call/apply
唯一能绕过硬绑定的场景:new 调用
当用 new boundFn() 实例化时,this 会指向新创建的实例,而不是 bind 绑定的对象 —— 这是唯一例外。
- 此时函数被视为构造器,硬绑定被主动忽略
- 普通调用、call、apply、箭头函数嵌套、间接引用……全都不影响 this 固化
- 注意:箭头函数本身没有 this,所以对它调用 bind/call/apply 无意义
为什么设计成这样?
硬绑定的核心价值就是确定性。库作者、框架、工具函数(如防抖、请求封装)依赖它保证上下文不被意外篡改。如果 bind 的 this 可被 call 覆盖,反而会引入难以追踪的副作用。
- 需要动态切换 this?说明不该用 bind,而该用 call/apply 即时绑定
- 需要复用固定上下文 + 预设参数?bind 正是为此设计,且参数部分支持柯里化
- 需要“可变绑定”?应考虑闭包、类实例方法或显式传参,而非强行 hack bind
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










