无论如何在javascript / jQuery中检测递归方法?

时间:2014-02-04 04:38:13

标签: javascript jquery recursion

我正在研究计算代码的一小部分。我需要确定每当javascript / jQuery中出现递归时我需要终止递归。

在javascript / jQuery中有没有支持这个的api?

3 个答案:

答案 0 :(得分:5)

您可以实施自己的递归保护。 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;

您也可以将布尔值转换为计数器,并且只允许递归达到一定数量的级别。

仅供参考,因为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;
         }

     }
 })();

注意:这使用了try / finally块,所以即使你的代码或你调用的任何代码抛出异常,计数器仍然被清除(因此它永远不会被卡住)。

答案 1 :(得分:3)

在某种程度上,您可以通过函数caller的{​​{1}}属性执行此操作:

function Test()
{
    if (Test.caller === Test && confirm("Recursion detected, stop?"))
        return;
    Test();
}

Test();

可以进一步改进此代码,以便将caller链向上移动到根,以检测隐式递归。

答案 2 :(得分:0)

另一个狡猾的伎俩。如果您使用.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);
}