bind函数用于改变this的指向,如果对一个函数多次进行bind后的this,是否会改变?
我们先准备如下代码
let a = { name: '我是对象a' }
let b = { name: '我是对象a' }
let fn = function () { console.log(this) }
开始正常的bind使用:
fn.bind(a)() // {name: "我是对象a"}
现在对这个函数使用第二次bind
fn.bind(a).bind(b)() // {name: "我是对象a"}
返回的结果还是对象a,其实不管bind几次,this的指向永远是第一次的bind决定;
我们可以手写一个简单的bind函数实现,看看内部是怎么运行的
function bind(fn, context) {
return function () {
return fn.apply(context, arguments)
}
}
再用于我们的案例中
bind(fn, a)() // {name: "我是对象a"}
bind(bind(fn, a), b)() // {name: "我是对象a"}
注意以上例子,我们写一个内部模拟的实现就明白为什么this永远是第一次bind决定的了
在bind对象b的时候,内部已经是这种结构了
bind(bind(fn, a), b)() => bind(fn, a).apply(b, arguments)
能看出来再使用bind时,是往外层的函数使用bind,那么this永远是第一次bind决定的,改变不了。