命名空间Javascript中的递归函数

Recursive function in namespaced Javascript

本文关键字:递归函数 Javascript 命名空间      更新时间:2023-09-26

为了组织起见,我对一个站点进行了命名(NS.something.functionA()等(。我想在这个名称空间的Javascript中有一个递归函数,但当函数试图调用自己时,我会得到一个undefined is not a function错误。

http://jsfiddle.net/fmpeyton/Jwz6g/

var timeoutInt = 2000;
var NS = {};
var resultsElement = document.getElementById('results');
NS.recur1 = (function(){
    setTimeout(function(){
        NS.recur1();
        resultsElement.innerHTML += 'recur1 re-occuring!<br/>';
    }, timeoutInt);
})();
(function recur2(){
    setTimeout(function(){
        recur2();
        resultsElement.innerHTML += 'recur2 re-occuring!<br/>';
    }, timeoutInt);
})();
NS.recur3 = (function(){
    (function realRecur3(){
        setTimeout(function(){
            realRecur3();
            resultsElement.innerHTML += 'recur3 re-occuring!<br/>';
        }, timeoutInt);
    })()
})();

recur1()是我遇到问题的函数。recur2()是我以前在JS中看到递归工作的方式。recur3()是我一直在考虑的一个想法(不理想,但绝对是一个解决方案(。

有什么方法可以使递归函数recur1()工作吗

NS.recur1 = (function(){
  setTimeout(function(){
    NS.recur1();
    resultsElement.innerHTML += 'recur1 re-occuring!<br/>';
  }, timeoutInt);
})(); // << This () invokes the function you just wrapped

因此NS.recur1不是一个"函数",而是该调用的返回。

因此,当您调用NS.recur1()时,您就是在针对undefined调用recur1(),因为调用不会返回任何内容。

简单的替代方案是不在分配时调用,而是在稍后的某个时刻调用

NS.recur1 = function(){
  setTimeout(function(){
    NS.recur1();
    resultsElement.innerHTML += 'recur1 re-occuring!<br/>';
  }, timeoutInt);
};
NS.recur1(); // begin recursion
(function recur1(){
    setTimeout(function(){
        recur1();
        resultsElement.innerHTML += 'recur1 re-occuring!<br/>';
    }, timeoutInt);
})();

您可以命名函数表达式,当您这样做时,名称将绑定到函数体中函数表达式的结果。

语言规范解释

生产函数表达式:function标识符(FormalParameterListopt({FunctionBody}评估如下:

调用envRec的CreateImmutableBinding(N(具体方法,传递Identifier的String值作为参数。

第一个递归1不是一个函数,它是一个闭包,函数和闭包(执行自己包装一些内部逻辑的函数(是不同的东西,你把它们都搞砸了。

我认为,您想要的是声明这些函数,然后调用其中一个函数,以触发由一个名为timeoutInt的标志计时的循环递归,因此您需要创建一种代码流,用timeout Int毫秒来更新某些内容。

 var timeoutInt = 2000;
 var NS = {};
 var resultsElement = document.getElementById('results');
 NS.recur1 = function(){
     setTimeout(function(){
         NS.recur1();
         resultsElement.innerHTML += 'recur1 re-occuring!<br/>';
     }, timeoutInt);
 };
 NS.recur2 = function(){
     setTimeout(function(){
         NS.recur2();
         resultsElement.innerHTML += 'recur2 re-occuring!<br/>';
     }, timeoutInt);
 };
 NS.recur3 = function(){
     setTimeout(function(){
         NS.recur3();
         resultsElement.innerHTML += 'recur3 re-occuring!<br/>';
     }, timeoutInt);
 };

使用上面的代码并从这一点开始。

以下是帮助您的进一步推送:http://jsfiddle.net/Jwz6g/1/(工作示例(