dev*_*r87 7 javascript recursion
为什么版本A可以工作,但版本B没有?如何在不在函数外声明全局变量的情况下使版本B工作(这是不好的做法)?我不清楚为什么我不能在函数本身内声明计数.
一个)
var count = 0;
var containsFiveOrMoreDivs = function(domElement) {
if (domElement && domElement.tagName === "DIV") {
count++;
}
//base case:
if (count >= 5) {
return true;
} else {
if (domElement.hasChildNodes()) {
var children = domElement.childNodes;
for (var i = 0; i < children.length; i++) {
if (containsFiveOrMoreDivs(children[i])) {
return true;
}
}
}
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
B)
var containsFiveOrMoreDivs = function(domElement) {
var count = 0;
if (domElement && domElement.tagName === "DIV") {
count++;
}
//base case:
if (count >= 5) {
return true;
} else {
if (domElement.hasChildNodes()) {
var children = domElement.childNodes;
for (var i = 0; i < children.length; i++) {
if (containsFiveOrMoreDivs(children[i])) {
return true;
}
}
}
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
你真正需要的是两个功能,一个在另一个内部:
function containsFiveOrMoreDivs(domElement) {
var count = 0;
function doCount(domElement) {
if (domElement && domElement.tagName === "DIV") {
count++;
}
//base case:
if (count >= 5) {
return true;
}
else {
if (domElement.hasChildNodes()) {
var children = domElement.childNodes;
for (var i = 0; i < children.length; i++) {
if (doCount(children[i])) {
return true;
}
}
}
return false;
}
}
return doCount(domElement);
}
Run Code Online (Sandbox Code Playgroud)
在该设置中,传入元素引用,然后外部函数在初始化计数器后调用内部函数.
这里原来不是很好的答案
您的第二个版本("B")具有"count"作为函数的局部变量.函数的每次调用都会获得它自己的"count"变量,并且在每次调用时,首先发生的事情是它被初始化为零.
如果您不想要全局,可以使用闭包:
var containsFiveOrMoreDivs = function() {
var count = 0;
return function(domElement) {
if (domElement && domElement.tagName === "DIV") {
count++;
}
//base case:
if (count >= 5) {
return true;
} else {
if (domElement.hasChildNodes()) {
var children = domElement.childNodes;
for (var i = 0; i < children.length; i++) {
if (containsFiveOrMoreDivs(children[i])) {
return true;
}
}
}
return false;
}
};
}();
Run Code Online (Sandbox Code Playgroud)
该代码将您的实际计数器函数包装在包含"count"变量的匿名函数中.它不会是全球性的; 它对"containsFiveOrMoreDivs"函数完全是私有的.这就像两全其美:你将"计数"看作是一个全球性的,但它不是全球性的.你不必担心携带一个参数.