bind返回的新函数与原函数不相等且无法通过标准方式识别绑定信息;每次调用都生成新函数对象,无api获取绑定目标或参数;箭头函数bind不生效,但属特例。

JavaScript 中 bind 返回的函数与原函数不是同一个函数对象,因此用 === 或 == 比较必然为 false;它是一个新创建的、具有预设 this 和部分参数的新函数。
bind 返回的是全新函数对象
Function.prototype.bind 每次调用都会创建并返回一个全新的函数实例,即使对同一函数多次调用 bind(参数完全相同),返回的也是不同引用。
- 这意味着
fn.bind(obj) === fn.bind(obj)结果是false - 也意味着无法通过
===判断两个绑定函数是否“逻辑等价” - 该函数内部保存了原始函数、绑定的
this值和预设参数,但这些信息不可直接访问(无标准属性暴露)
无法通过标准方式反向识别绑定来源
ECMAScript 规范未提供任何标准 API 来查询一个函数是否由 bind 生成,或获取其绑定的目标函数、this 值或预设参数。
-
boundFn.toString()在多数引擎中返回类似"function () { [native code] }",不包含源信息 -
boundFn.name通常为"bound " + original.name,但仅作标识,不能用于可靠判定 - 没有
boundFn.__proto__.original或boundFn.getBoundTarget()这类标准接口
实际场景中的身份判定建议
若业务逻辑依赖“是否为某函数绑定后得到”,应主动管理标识,而非依赖运行时检测:
- 在创建绑定函数时,手动添加可识别的属性(如
fnBounded = fn.bind(ctx); fnBounded.$$isMyBound = true;) - 使用 WeakMap 缓存绑定关系:
const boundMap = new WeakMap(); boundMap.set(boundFn, { target: fn, thisArg: ctx }); - 避免在关键路径中依赖绑定函数的“相等性”,改用语义化设计(如事件处理器统一用 symbol key 标识)
注意:箭头函数与 bind 无关
箭头函数没有自己的 this,也不能被 bind 改变其上下文,所以 arrowFn.bind(obj) 返回的仍是原箭头函数本身(不新建函数)。
- 此时
arrowFn.bind(obj) === arrowFn为true - 但这属于特例,不适用于普通函数,也不代表“可判定身份”
- 仍不应依赖此行为做通用判定逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











