zoukankan      html  css  js  c++  java
  • 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也是一样的,这点从最后一张图上看的很清楚)

    再看下面

     

  • 相关阅读:
    音乐播放器
    滚动视图、定时器、分页控件的综合使用
    简易拼图
    IOS开发复习笔记(1)-OC基础知识
    64位matlab mex64位编译器解决方案
    LibSvm添加到Matlab
    code first 数据库无损迁移
    asp.net mvc4连接mysql
    自定义控件引用时候尺寸发生变化
    jquery 操作动态添加的元素
  • 原文地址:https://www.cnblogs.com/pittle-z/p/12721031.html
Copyright © 2011-2022 走看看