已经被bind绑定的函数能否再次使用bind方法进行绑定?
问题结论
这个问题完全属于this绑定规则的范畴,二次bind不生效是JavaScript硬绑定的固有特性。
核心原因
Function.prototype.bind的作用是返回一个新的绑定函数,这个新函数内部已经锁死了原始函数的this指向,后续对这个返回的绑定函数再次调用bind,只会修改绑定函数本身的this,不会影响已经被锁死的原始函数的this指向。
我们可以用简化的bind实现逻辑来理解:
Function.prototype.myBind = function(context, ...args) { const originalFn = this; // 保存原始函数,也就是例子中的sayName return function(...newArgs) { // 执行的时候永远用第一次绑定的context调用原始函数 return originalFn.apply(context, args.concat(newArgs)); } }
对应你的代码逻辑:
sayName.bind(a)返回的绑定函数,内部已经固定原始sayName执行时的this为a- 再调用
.bind(b)的时候,是给第一步返回的绑定函数绑定this为b,但这个绑定函数执行时,内部还是会用第一次存的a作为context调用sayName,自然不会生效。
补充规则
this绑定的优先级从高到低为:new绑定 > 硬绑定(bind/apply/call)> 隐式绑定 > 默认绑定,硬绑定一旦完成,除了new调用,其他绑定方式都无法覆盖原始函数的this指向。
内容的提问来源于stack exchange,提问作者BDzhang
相关产品推荐
相关产品推荐

