代码之家  ›  专栏  ›  技术社区  ›  Falieson

如何修复JS绑定的实现?

  •  2
  • Falieson  · 技术社区  · 6 年前

    我正在为面试做准备,想编写自己的JS绑定函数的实现。我正在引用此polyfill代码: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind

    测试又回来了

     Expected value to equal:
          42
     Received:
          undefined
    

    感谢您帮助确定bind2函数的问题,如果您可以描述如何调试引用此函数的函数?

    主旨: https://gist.github.com/Falieson/580e4feb26e92ece7d93b102c78a6f76

    bind2.ts函数

    // tslint:disable no-any
    
    export default function bind2(this: any, that: any) {
      const f = this // tslint:disable-line no-this-assignment
      const initialArgs = Array.prototype.slice.call(arguments, 1)
    
      return (finalArgs: any[]) => f.apply(that, [...initialArgs, ...finalArgs])
    }
    

    bind2.test.ts

    // tslint:disable no-any
    import bind2 from '../bind2'
    
    function decorate(obj: any): any {
      const res = new Function()
      Object.assign(res, obj)
      res['bind2'] = bind2 // tslint:disable-line no-string-literal
      return res
    }
    
    describe('.bind2(target)', () => {
      test('works', () => {
        const data = {
          getX() {
            return this.x
          },
          x: 42,
        }
        const unboundGetX = data.getX
        const boundGetX = decorate(unboundGetX).bind2(data)
    
        expect(boundGetX()).toEqual(42)
      })
    })
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   joaner    6 年前

    你设定了 that this boundGetX() ,但是 undefined .

    export default function bind2(data: any) {
      const initialArgs = Array.prototype.slice.call(arguments, 1)
    
      return (finalArgs: any[]) => this.apply(data, [...initialArgs, ...finalArgs])
    };
    
    function decorate(obj: any): any {
      obj.bind2 = bind2
      return obj
    }