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

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)

Poi*_*nty 7

你真正需要的是两个功能,一个在另一个内部:

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"函数完全是私有的.这就像两全其美:你将"计数"看作是一个全球性的,但它不是全球性的.你不必担心携带一个参数.