JavaScript绑定复杂度

时间:2018-08-10 11:42:57

标签: javascript ecmascript-6 this bind

无论如何,我都不是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))
}

问题

现在,一切正常,如我所愿。但是,我对此设置有某些疑问。

  1. 这是一个api,所有如何确保(或简单地确认)同一路径的不同实例具有自己的值 this.cb ?< / strong> 如果getRouteA被10个不同的用户同时调用,this.cb是否会受到污染?

  2. AFAIK,bind创建并返回具有绑定上下文的新函数。但是,它只能这样做一次,并且对于连续绑定将不起作用。 如果我在n个不同的上下文中绑定相同的函数,我会得到n个不同的函数吗? 在routeA和B中都绑定了回调,这两个不同的函数是否具有各自的作用域?

  3. >
  4. 现在,我为回调添加了一个额外的参数,它现在看起来像(err, data, cb),而不是将其绑定到异步函数中,因此它是这样的:asycDBOperationY(..., (e, d) => callback(e, d, cb)) 这行得通,我很好奇关于通过参数调用共享函数和通过绑定上下文之间的区别。在哪种情况下,哪个优先于另一个?

谢谢:)

1 个答案:

答案 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参数代替]可行,但我对通过参数调用共享函数和绑定上下文之间的区别感到好奇。

区别在于它与其他版本相反。