命名空间Javascript中的递归函数
Recursive function in namespaced Javascript
为了组织起见,我对一个站点进行了命名(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/(工作示例(
- 返回不会退出 javascript 中的递归函数
- Javascript递归函数引用了这一点
- jQuery递归函数调用和Javascript之间有区别吗;s setInterval
- 从javascript中的递归函数获取undefined
- 将递归函数转换为异步 CPS 实现 (javascript)
- 在Javascript的递归函数中使用正则表达式进行解析
- 寻找关于改进我的javascript(jquery)代码的想法.递归函数
- JavaScript:递归函数不能正常工作
- 递归函数在javascript中不返回Label
- Javascript:递归函数返回现有值的未定义
- 如何在 javascript 中获取递归函数来输出每个返回值
- 为什么这个递归的javascript函数返回它的作用
- JavaScript递归函数错误答案
- JavaScript递归函数中的错误
- 如何在 JavaScript 中停止递归函数
- JavaScript + 递归函数返回 undefined
- JavaScript 返回递归函数
- Javascript 递归函数性能下降
- 在递归函数 JavaScript 上获取未定义的返回
- 将参数传递给递归函数javaScript