【问题标题】:JavaScript .bind mehtod doesn't catch up a contextJavaScript .bind 方法没有赶上上下文
【发布时间】:2021-10-13 08:09:01
【问题描述】:

在用户的 sendTo 方法中,我尝试绑定之前定义的函数并将 this.name 作为第一个参数发送。但如果我尝试控制台日志记录,this.name 将返回 undefind。如何将用户对象的上下文正确绑定到 sendTo() 方法?

function sendFrom(from, to, text) {
    console.log(this);
    return `${from}'s packet --> ${to}  \nmessage: ${text}`;
}

let user = {
    name: "Alex",
    sendTo: sendFrom.bind(this, this.name),
}


user.sendTo = user.sendTo.bind(user);

console.log(user.sendTo("John", "some message"));
{}
undefined's packet --> John  
message: some message

【问题讨论】:

  • 不应该是user.sendTo.bind(this, user)吗?
  • @JeremyThille 如果我使用 user.sendTo.bind(this, user),它似乎将整个用户对象绑定到 sendFrom() 的第二个参数 undefined's packet --> [object Object]
  • 对象字面量不创建范围,即this 不引用对象字面量(此时对象甚至不存在)。这与使用.bind无关。

标签: javascript node.js ecmascript-6


【解决方案1】:

我猜你可以通过不使用任何绑定来实现预期的行为:

function sendFrom(to, text) {
    console.log(this);
    return `${this.name}'s packet --> ${to}  \nmessage: ${text}`;
}

let user = {
    name: "Alex",
    sendTo: sendFrom
}

console.log(user.sendTo("John", "some message"));

但是,如果您想在绑定时发挥作用的其他地方执行用户的方法:

let alexeSendTo = user.sendTo
alexesSendTo('John', 'Hey John!') // it will loose Alex's user context link

let alexeSendTo = user.sendTo.bind(user)
alexesSendTo('John', 'Hey John!') // now it is marked as Alex message

【讨论】:

  • 我实际上是想了解上下文在绑定函数中是如何工作的。所以这个例子很好,但这不是我想要实现的。不过还是谢谢你的回答!
  • @shevy 看看我的答案以获得解释。让你知道,这里不需要绑定,这可能不是最好的例子。 Dmitrii 的代码是正确且最简单的方法
  • @TusharShahi 好的,谢谢。 p.s.我只是在体验 JS,很可能我永远不会在生产中遇到这个例子。我只是想更清楚地了解 JS 上下文行为。 :)
【解决方案2】:

要了解为什么这不起作用,您必须查看 user 对象:

sendTo: sendFrom.bind(this, this.name),

user 中的这个属性是导致问题的原因。当这段代码运行this属于窗口对象而不是用户。

所以最后sendTo 是一个方法,其上下文为window,第一个参数为window.name

这就是console.log(this) 返回窗口对象的原因。

当你这样做时: console.log(user.sendTo("John", "some message"));

您在已经附加的参数之后添加参数"John""some message"

所以最终参数变成:

从,到,文本 -> window.name(在你的情况下未定义),约翰,一些消息

只要你在这段代码中使用this,它指的是window。实际上这里没有办法理解 binding 并且这个例子不是你应该使用 bind

的地方

【讨论】:

  • 是的,谢谢。我弄清楚为什么它会这样工作。但是你能解释一下我如何在其中应用当前对象的上下文吗?
  • @shevy 正如上面的答案评论中提到的,添加绑定,这里的一切都结束了,不会向你展示绑定的工作方式。看看 Felix 的链接
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2020-09-20
  • 2013-04-23
相关资源
最近更新 更多