使用.length时获取“typeError”“不是函数”

时间:2017-06-28 03:20:34

标签: javascript

这是我的代码:

function permAlone(string) {
  if (string.length < 2) return string; // This is our break condition

  var permutations = []; // This array will hold our permutations

  for (var i = 0; i < string.length; i++) {
    var character = string[i];

    // Cause we don't want any duplicates:
    if (string.indexOf(character) != i) // if char was used already
      continue; // skip it this time

    var remainingString = string.slice(0, i) + string.slice(i + 1, string.length); //Note: you can concat Strings via '+' in JS

    for (var subPermutation of permAlone(remainingString))
      permutations.push(character + subPermutation);

  }

  var permutationsFinal = [];
  for (var j = 0; j < (permutations.length); j++) {
    if (!(permutations[j].match(/([a-zA-Z])\1/))) {
      permutationsFinal.push(permutations[j]);
    }
  }

  return (permutationsFinal.length);
  //                       ^^^^^^^^ if I add this, the error is thrown
}

permAlone('abc');

如果我更换:

return (permutationsFinal);

由:

return (permutationsFinal.length);

我在控制台中收到此错误:

  

TypeError:permAlone不是函数

为什么吗

感谢您的帮助! :)

2 个答案:

答案 0 :(得分:3)

要从评论中删除答案:

for (var subPermutation of permAlone(remainingString))遍历函数的返回值(递归调用)。这是错误的行号。数字不可迭代,因此当您返回数字而不是数组时,它会抛出错误。

不确定您使用的浏览器,但FireFox会将错误报告为

  
    

TypeError:permAlone(...)不可迭代

  

或多或少是自我解释的。如果您的浏览器中报告的错误消息是针对发布的代码,则可以说它不仅具有误导性,而且实际上不正确。

答案 1 :(得分:3)

这是一个递归函数,如果你返回的函数不是函数本身的预期,那么你将破坏递归循环。