Как исправить мою реализацию js bind? - PullRequest
0 голосов
/ 25 июня 2018

Я готовлюсь к собеседованиям и хотел написать свою собственную реализацию функции привязки JS.Я ссылаюсь на этот код полифилла: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind

Тест возвращается

 Expected value to equal:
      42
 Received:
      undefined

Спасибо за вашу помощь в определении проблемы с функцией bind2, и если вы смоглиопишите, как бы вы отлаживали функцию, которая ссылается на это?

gist: 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.тс

// 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 Ответ

0 голосов
/ 25 июня 2018

Вы устанавливаете that как this из boundGetX(), но that параметр равен 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
}
...