关于为什么我的JS闭包无法正常返回的说明?

时间:2019-05-31 16:32:36

标签: javascript closures

我正在为Two-Sum(也许有点过分设计,但主要是让我对递归和闭包感到满意)的解决方案,并且在必要时我试图避免在全局范围内建立计数器。但是,我的函数返回的是未定义的,而且我真的不知道自己在做什么错。

因此,我将我的功能(最初的innerFunction是功能的整体,startingIndex是全局的)包装在一个内部功能中,将returnArray设置为在{{1} }完成,然后返回... innerFunction。我将returnArray分配给returnArray的返回值似乎无关紧要,但仍未定义。我必须缺少关于执行上下文的信息,我敢肯定这很明显,但是我正在空白。

innerFunction

例如,我希望function twoSum(numArr, target) { let startingIndex = 0; let returnArray = []; function innerFunction(array, integer) { let startNum = array.shift(); let subtractedNum = integer - startNum; let found = array.findIndex(function(element) { return element === subtractedNum }) if (found >= 0) { //found is the index of the shortened array //add 1 for the initial shift //add starting index, which doubles to track the amount of shifts thus far let endingIndex = found + 1 + startingIndex return [startingIndex, endingIndex]; } else { startingIndex++; innerFunction(array, integer); } } returnArray = innerFunction(numArr, target) return returnArray; } console.log(twoSum([4,2,5,7,8,1,9,12,3], 15));输出twoSum([4,2,5,7,8,1,9,12,3], 15),就像包装函数之前一样。我想念什么?

2 个答案:

答案 0 :(得分:2)

您的innerFunctionelse分支中不返回任何内容,但是您将其调用的返回值分配给returnArray变量。

您还必须返回递归调用的结果:

 } else {
     startingIndex++;
     return innerFunction(array, integer);
 }

答案 1 :(得分:2)

您的结果是不确定的,因为此行需要一个return语句: innerFunction(array, integer);

这是一个可行的解决方案:

     function twoSum(position, array, integer) {
        let answer = []
        let startNum = array[position];
        let subtractedNum = integer - startNum;

        let index = -1
        for (var i = position + 1; i < array.length; i++) {
          if( array[i] === subtractedNum ) {
            index = i
          }
        }

        if (index >= 0) {
          answer = [[position, index]]
        }

        if (array.length - position > 1) {
          let theRest = twoSum(position + 1, array, integer);      
          answer = [...answer, ...theRest]
        }
        return answer
      }


    console.log(twoSum(0, [4,2,5,7,8,1,9,12,3], 15));

即使您添加此return语句,您的解决方案当前也只会返回一个答案,除非您将答案扔到全局累加器(returnArray)上或在返回递归函数之前合并您的答案(这是什么)我选择在上面做)。