为何JavaScript链式调用bind会保留第一个绑定的上下文?
为什么链式调用bind时只有第一个绑定的上下文生效
这得从bind的本质说起:它会生成一个新的绑定函数,这个函数的核心逻辑就是——不管后续怎么折腾,调用原函数时都会把this牢牢锁在第一次绑定的对象上,后续的bind、call、apply都没法改这个this。
拆解你的代码执行步骤就懂了:
showName.bind(user):生成了一个新函数,咱们叫它fn1。fn1的本事就是:只要它被调用,不管外界给它传什么this,它都会把原函数showName的this固定成user。- 然后调用
fn1.bind(user2):这时候是给fn1做绑定,但fn1本身已经是个“死心眼”的绑定函数了——它内部根本不看你新绑定的user2,调用的时候还是会按之前的规则,用user来执行showName。所以第二次bind等于白忙活。
你可以用一段简单的代码模拟bind的核心逻辑,一看就明白:
Function.prototype.myBind = function(context) { const originalFn = this; // 返回绑定后的新函数 return function() { // 不管这个新函数被怎么调用,都用第一次传入的context当this return originalFn.apply(context, arguments); } }
当你链式调用myBind(user).myBind(user2)时,第二个myBind返回的函数,调用时会触发第一个myBind的返回函数,而后者早就把this钉死在user上了,user2根本插不上手。
内容的提问来源于stack exchange,提问作者Lilo Randl
相关产品推荐
相关产品推荐

