为什么版本 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;
}
};
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;
}
};
最佳答案
你真正需要的是两个函数,一个在另一个里面:
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);
}
在该设置中,您传入一个元素引用,然后外部函数在初始化计数器后调用内部函数。
这里的原始答案不是很好
您的第二个版本(“B”)将“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;
}
};
}();
该代码将您的实际计数器函数包装在一个包含“count”变量的匿名函数中。它不会是全局性的;它将对“containsFiveOrMoreDivs”函数完全私有(private)。这就像两全其美:您可以将“计数”视为全局的,但它不是全局的。您无需担心携带参数。
关于javascript - 没有声明全局变量递归不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291932/