javascript - 没有声明全局变量递归不起作用

标签 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;
    }
  };

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/

相关文章:

javascript - 解析数据库作业未从 http 请求获取所有结果

javascript - 在 2D Canvas 中,有没有办法给 Sprite 一个轮廓?

javascript - 为什么这个实现有不同的结果?

php - 使用 PHP 从 XML 文档中删除特定类型的所有元素

c++ - 递归获取二叉搜索树的高度

javascript - 我想使用 JavaScript chop 带有省略号的文本或行

javascript - 在 NW.js 应用程序中设置 HTML5 文件 API 的配额

python - 在不使用局部/内部变量的情况下在 Python 中递归

recursion - 如何以递归方式更改字符串向字符串添加一个数字并将每个数字添加到列表中

javascript - 如何使用递归计算字符串中的所有回文?