Bind源码之两次绑定bind,第二次为什么失效?

思考:两次调用bind 第二次调用bind绑定无效
第一次调用bind时,返回一个构造函数f,形成闭包
第二次调用就是f.bind({}),又返回一个f,又是一个闭包
var a1 = show.newBind({a:'123'},'p2')
var b2 = a1.newBind({b:'234'},'19');

var c1 = b1.newBind({c:'567'},'20');

c1()
第33行代码打印 target会一次打印下面三行
{c: "567"}    {b: "234"}     {a: "123"}

但是最终打印出来的结果确实定义绑定的target ( 图中66行所示 )

 

 

 

 

 结论:每次bind一个对象,多会形成一个闭包,然后在之前的那个闭包上再形成闭包(也就是在闭包的基础上返回闭包);

 每次bind一个对象target,形成一次闭包,多会往一个闭包队列里面添加这个需要bind的对象target,因此当我们打印target的时候就会打印出多个target的值

我把这个再闭包的基础上添加闭包的操作看做是一个入栈操作,至于最后为什么会只绑定上第一个bind的target 我猜是当执行到土中47行代码的时候

 首先执行C1() 出栈(也就是最后一个绑定返回的f执行),然后执行到下面这条语句依次往前面出栈

return self.apply((target || window), args.concat(_args));   //这个操作我理解为出栈  

会找这个 target 和 self   按照入栈的操作,先bind的target 后出来 所以第一个bind的target是最后出来的 ,覆盖前面的target(同样的道理self也是一样的,这点从最后一张图上看的很清楚)

 

 

 

 

 

 

再看下面

 

 

 

posted @ 2020-04-17 16:56  我的世界开始下雪  阅读(927)  评论(0编辑  收藏  举报