无论如何,是否可以在JavaScript/jQuery中检测递归方法



我正在处理计算代码的一小部分。我需要确定每当在JavaScript/jQuery中发生递归时,我都需要终止该递归。

在JavaScript/jquery中有任何API吗?

您可以实现自己的递归保护。jQuery中没有任何内置的东西可以在本地支持防止递归。

function myFunc(arg) {
    // if this function already executing and this is recursive call
    // then just return (don't allow recursive call)
    if (myFunc.in) {
        return;
    }
    // set flag that we're in this function
    myFunc.in = true;
    // put your function's code here

    // clear flag that we're in this function
    myFunc.in = false;
}
myFunc.in = false;

您也可以将布尔人变成计数器,只允许递归最多达到一定数量的级别。

fyi,因为JS是单线线程,因此,如果您的功能从不是您的代码中进行某种回调,则可能需要保护。如果是您自己的所有代码,那么您应该确保自己的代码不会引起此类问题。


这是一个更万无一失的版本,可以在闭合中保护柜台,因此无法在功能之外操纵它:

 var myFunc = (function() {
     var inCntr = 0;
     return function(args) {
         // protect against recursion
         if (inCntr !== 0) {
             return;
         }
         ++inCntr;
         try {
             // put your function's code here
         } finally {
             --inCntr;
         }
     }
 })();

注意:这使用一个尝试/最后阻止,因此即使您的代码或您调用的任何代码都会抛出异常,该计数器仍会被清除(因此它永远不会卡住)。

另一个狡猾的技巧。如果您使用.bind(this)之类的内容进行递归或使用箭头功能,则它将无法正常工作。

boom();
function boom () {
  if(arguments.callee === arguments.callee.caller) {
    console.log('no recursion will happen');
    return;
  }
  boom();
}

简单解决方案可以是参数中的标志

boom2();
function boom2 (calledRecursively) {
  if(calledRecursively) {
    console.log('no recursion will happen');
    return;
  }
  boom2(true);
}

最新更新