gpt4 book ai didi

Javascript 绑定(bind)复杂性

转载 作者:行者123 更新时间:2023-11-30 06:23:33 27 4
gpt4 key购买 nike

无论如何我都不是 Javascript 的新手;也就是说,我对 bind 的作用及其行为方式有了基本的了解。但是,我遇到了一个我对结果有点不确定的用例。让我详细说明一个示例设置:

示例设置

首先,我有一个函数(回调)将绑定(bind)到其他函数(api 路由)中。 (它目前位于一个单独的文件中)

function callback(err, data) {
...
this.cb(response)
}

如您所见,this.cb 由路由传递并且对它们是唯一的。

function getRouteA(args, cb) {
this.cb = cb;
...
asycDBOperationX(..., callback.bind(this))
}

function getRouteB(args, cb) {
this.cb = cb;
...
asycDBOperationY(..., callback.bind(this))
}

问题

现在,一切都像我希望的那样运行良好。但是,我对此设置有一些疑问。

  1. 这是一个 api 和所有,我如何确保(或简单地确认)同一路由的不同实例具有它们自己的值 this.cb ?如果 getRouteA 被 10 个不同的用户同时调用,this.cb 会被污染吗?

  2. 据我所知,绑定(bind)创建并返回一个具有绑定(bind)上下文的新函数。但是,它只会执行一次并且不会对后续绑定(bind)起作用。 如果我在 n 个不同的上下文中绑定(bind)同一个函数,我会得到 n 个不同的函数吗?它如何违反只绑定(bind)一次的规则? 回调在路由 A 和 B 中都被绑定(bind),这两个不同的函数是否有自己的作用域?

  3. 现在,我已经为回调添加了一个额外的参数,它现在看起来像 (err, data, cb) 而不是在异步函数中绑定(bind)它,而是这样调用它: asycDBOperationY(..., (e, d) => callback(e, d, cb)) 虽然这可行,但我很好奇通过参数调用共享函数之间的区别并通过绑定(bind)上下文。哪一个比另一个更受欢迎?在什么情况下?

谢谢 :)

最佳答案

how do I ensure (or simply confirm) that different instances of same route have their own value of this.cb?

你没有,那是你设置的问题。如果你这样做:

 sth.getRouteA({}, one);
sth.getRouteA({}, two);

然后 two 将被调用两次。

If I bind the same function in n different contexts, will I get n different functions? How does it work against the rule of binding only once?

是的,你可以多次绑定(bind)一个函数,但是你不能再次绑定(bind)一个绑定(bind)函数,所以:

  cb.bind(a).bind(b)

仍然会绑定(bind)到a,第二个绑定(bind)没用。

cb.bind(a)
cb.bind(b)

然而,当一个非绑定(bind)函数被包装到两个具有不同上下文的绑定(bind)函数中时,这会按预期工作。

While [adding an extea parameter instead] works, I am curious as to the difference between calling a shared function by parameter and by binding the context.

不同之处在于它与其他版本相反。

关于Javascript 绑定(bind)复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51785767/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com