Javascript绑定复杂性

Javascript绑定复杂性,javascript,ecmascript-6,this,bind,Javascript,Ecmascript 6,This,Bind,我不是Javascript的新手;也就是说,我对bind的功能和行为有一个基本的了解。然而,我遇到了一个用例,我对结果有点不确定。 让我详细介绍一个示例设置: 样本设置 首先,我有一个函数(回调),它将绑定到其他函数(api路由)中。(它当前位于单独的文件中) 正如您所看到的,this.cb是由路由传递的,并且是它们独有的 function getRouteA(args, cb) { this.cb = cb; ... asycDBOperationX(..., callback.b

我不是Javascript的新手;也就是说,我对bind的功能和行为有一个基本的了解。然而,我遇到了一个用例,我对结果有点不确定。 让我详细介绍一个示例设置:

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

正如您所看到的,
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 如果10个不同的用户几乎同时调用getRouteA,
    this.cb
    会被污染吗

  • AFAIK,bind创建并返回一个具有绑定上下文的新函数。但是,它只执行一次,并且对于连续绑定不起作用如果我在n个不同的上下文中绑定相同的函数,我会得到n个不同的函数吗?它是如何违反只绑定一次的规则的?回调在routeA和B中都被绑定,这两个不同的函数有各自的作用域吗

  • 现在,我已经为回调添加了一个额外的参数,它现在看起来像
    (err,data,cb)
    ,而不是在异步函数中绑定它,所以称它为:
    asycdboperation(…,(e,d)=>callback(e,d,cb))
    ,尽管这样做有效,我很好奇通过参数调用共享函数和通过绑定上下文调用共享函数之间的区别。哪一种方案优于另一种方案?在什么情况下?

  • 谢谢:) 我如何确保(或简单地确认)同一路由的不同实例具有自己的this.cb值

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

     sth.getRouteA({}, one);
     sth.getRouteA({}, two);
    
    然后将调用两次
    two

    如果我在n个不同的上下文中绑定同一个函数,会得到n个不同的函数吗?它是如何违反只绑定一次的规则的

    是,可以多次绑定函数,但不能再次绑定绑定函数,因此:

      cb.bind(a).bind(b)
    
    仍将绑定到
    a
    ,第二次绑定无效

    cb.bind(a)
    cb.bind(b)
    
    然而,当一个非绑定函数被包装成具有不同上下文的两个绑定函数时,这一点与预期一样有效

    虽然[改为添加extea参数]有效,但我很好奇通过参数调用共享函数和通过绑定上下文调用共享函数之间的区别


    区别在于它的工作原理与另一个版本相反。

    从代码中很难看出您想要实现什么,特别是通过
    回调
    的间接回调调用。另外,这些函数中的
    是什么?请用一个演示问题的示例更新您的问题,最好是使用堆栈片段(工具栏按钮)运行的问题。“我如何确保(或简单地确认)同一路由的不同实例有自己的
    this.cb
    ?”-好,如何确保不同的实例具有不同的
    this
    值?你是如何调用这些路由函数的,它们是方法还是构造函数?@T.J.Crowder为这段困难的代码道歉,我尽可能地简化它。但不确定如何在代码段中模拟异步DB操作。无法使用setTimeout,因为它会更改上下文。@Bergi我不知道不同的实例是否具有不同的this值,这是我怀疑的问题之一。我的路由功能的设置类似于在节点中使用路由器的方式->“/path/routeA”设置为getrouteA@PriteshTupe-DB操作回调也是如此
    setTimeout
    正是您模拟异步DB op.1的方式。如果同一this.variable被调用两次,那么该设置在实际使用中将不起作用?2.我不知道我是否理解其中的区别-与其他版本相反?你能详细说明一下吗?谢谢
    cb.bind(a)
    cb.bind(b)