如何判断JavaScript中的对象是否已被bind绑定?
背景:
根据MDN bind文档描述:
调用boundFn.bind(thisArg, /* 更多参数 */)可以进一步绑定一个绑定函数,从而创建另一个绑定函数boundFn2。新绑定的thisArg值会被忽略。
文档中的示例代码展示了“新this值”(boundLog2的thisArg)会被忽略:
"use strict"; // 防止`this`被包装成包装对象 function log(...args) { console.log(this, ...args); } const boundLog = log.bind("this value", 1, 2); const boundLog2 = boundLog.bind("new this value", 3, 4); boundLog2(5, 6); // "this value", 1, 2, 3, 4, 5, 6
问题:
当从库中导入对象时,例如:
import obj from library
是否有办法提前检查obj是否已被绑定?我想知道obj是否是之前某次bind调用的结果,这是否可行?
没有可靠的通用方法能检测一个函数是否是bind调用的结果。
原因如下:
- 绑定函数没有公开的标准属性或标识来区分它和普通函数。虽然部分JS引擎可能会给绑定函数添加内部属性,但这些都是非标准的,不同引擎实现不同,且无法通过常规代码访问。
- 尝试通过
name属性推断(绑定函数的name通常为bound 原函数名)并不靠谱:原函数可能无名称,name属性也可被手动修改,部分场景下该规则不生效。 - 调用
obj.bind()观察行为也无法作为判断依据,因为绑定函数再次调用bind会返回新函数,但无法反推原函数是否为绑定结果。
如果你的需求是确保函数能重新绑定this,可以尝试用call或apply强制指定this调用函数——需要注意的是,绑定函数的this是固定的,call/apply无法修改其指向,若指定不同this后函数行为无变化,大概率是绑定函数,但这也不是绝对可靠的判断方式。
内容的提问来源于stack exchange,提问作者Tamir Abutbul
相关产品推荐
相关产品推荐

