首页 > 解决方案 > 如何在函数定义中使用没有“this”的 bind() 方法?

问题描述

我一直在阅读有关该方法的很多内容,bind()并且开始了解它设置this为特定对象。这几乎总是意味着this函数定义中的某个地方指向某个对象。但是,我在bind()没有this在函数定义中使用的情况下看到了。更具体地说,this被用作一个论点,这让我感到困惑。例如,

const eventLoader = new DataLoader((eventIds) => {
  return events(eventIds);
});

const events = async eventIds => {
  try {
    const events = await Event.find({ _id: { $in: eventIds } });
    return events.map(event => {
      return transformEvent(event);
    });
  } catch (err) {
    throw err;
  }
};

const user = async userId => {
  try {
    const user = await userLoader.load(userId.toString());
    return {
      ...user._doc,
      _id: user.id,
      createdEvents: eventLoader.load.bind(this, user._doc.createdEvents)
    };
  } catch (err) {
    throw err;
  }
};

在此示例中,即使函数或函数在其函数定义中都有,也可以eventLoader.load.bind(this, user._doc.createdEvents)用作this参数。bind() 的第一个参数不是您希望预先存在的指向的地方吗?bind()eventLoadereventsthisthis

标签: javascriptfunctionthisbind

解决方案


bind() 的第一个参数不是您希望预先存在的 this 指向的地方吗?

对,就是这样。

在此示例中,即使函数或函数在其函数定义中都有,也可以eventLoader.load.bind(this, user._doc.createdEvents)用作this参数。bind()eventLoadereventsthis

更准确地说,DataLoader.load需要this是 DataLoader 才能正常工作。.bind因此,对它来说eventLoader 是有意义的eventLoader.bind(eventLoader, ...)。¹

绑定this没有意义,因为这是window(因为箭头函数采用父函数²的上下文,并且由于您没有父函数[从显示的代码],因此父函数是全局范围)。

¹继续阅读

²阅读更多


推荐阅读