无论如何,我都不是Javascript的新手。也就是说,我对绑定的功能及其行为有基本的了解。但是,我遇到了一个用例,在那里我不确定结果。 让我详细说明一个示例设置:
首先,我有一个函数(回调),该函数将绑定到其他函数(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))
}
现在,一切正常,如我所愿。但是,我对此设置有某些疑问。
这是一个api,所有如何确保(或简单地确认)同一路径的不同实例具有自己的值 this.cb
?< / strong>
如果getRouteA被10个不同的用户同时调用,this.cb
是否会受到污染?
AFAIK,bind创建并返回具有绑定上下文的新函数。但是,它只能这样做一次,并且对于连续绑定将不起作用。 如果我在n个不同的上下文中绑定相同的函数,我会得到n个不同的函数吗? 在routeA和B中都绑定了回调,这两个不同的函数是否具有各自的作用域?
现在,我为回调添加了一个额外的参数,它现在看起来像(err, data, cb)
,而不是将其绑定到异步函数中,因此它是这样的:asycDBOperationY(..., (e, d) => callback(e, d, cb))
这行得通,我很好奇关于通过参数调用共享函数和通过绑定上下文之间的区别。在哪种情况下,哪个优先于另一个?
答案 0 :(得分:0)
如何确保(或简单地确认)同一路由的不同实例具有此this.cb的值?
您没有,那就是设置的问题。如果您这样做:
sth.getRouteA({}, one);
sth.getRouteA({}, two);
然后two
将被调用两次。
如果我在n个不同的上下文中绑定相同的函数,我会得到n个不同的函数吗?它如何违反仅绑定一次的规则?
是的,您可以多次绑定一个函数,但是不能再次绑定一个绑定函数,所以:
cb.bind(a).bind(b)
仍将绑定到a
,第二个绑定无用。
cb.bind(a)
cb.bind(b)
但是,由于非绑定函数被包装到具有不同上下文的两个绑定函数中,因此可以正常工作。
虽然[添加一个extea参数代替]可行,但我对通过参数调用共享函数和绑定上下文之间的区别感到好奇。
区别在于它与其他版本相反。