如何检测 JavaScript 中的链式函数调用?

Sch*_*lle 5 javascript

var Obj = {
   func1 : function() {
      // some code
      if (this._hasChainedFunc()) {
         // block should be CALLED
      }
      return this;
   },
   func2 : function() {  
      // some code
      if (this._hasChainedFunc()) {
         // block should be NOT called
      }
      return this;
   },
   _hasChainedFunc : function() {
     // code which detects if there is a chained function???
   }
}

Obj.func1().func2();
Run Code Online (Sandbox Code Playgroud)

函数_hasChainedFunc()是否有可能的实现?这个函数应该在第一次调用时返回true(因为 func2() 之后被调用),在第二次调用时返回false

在更高级的版本中,_hasChainedFunc()也可能返回之后实际调用的函数。

Avi*_*ish 6

从技术上讲,您永远无法提前知道在当前调用之后是否还有另一个调用链接——这显然没有意义,因为这意味着您知道一些将在调用之前调用的代码。如果没有预编译器,您就无法做到这一点,我想这不是您所追求的。

相反,它可以检查是否有一直在上次通话链之前,当前呼叫。这只需要你在对象中保留一些关于先前调用的状态,并在你调用一个新函数时更新它。如果您只使用一个调用链,则可以通过在返回对象之前在对象上创建func1func2更改某些状态来实现此this目的。

如果要在同一个对象上调用多个链,则面临如何检测链的末端的问题。为此,您需要让每个链接函数返回一个围绕原始的包装器this,它将存储有关先前调用的状态。

如果您使用的包装方式,obj.func1().func2()要求func1obj,但func2上被调用返回的包装func1和此包装可能是意识到以前的func1电话。如果您稍后调用obj.func2().func1()thenfunc2现在被调用,objfunc1在知道先前func2调用的包装器上调用,等等。