是否可以使用 hidden/extra 参数初始化变量?

Is it possible to initialize a variable with a hidden/extra argument?

请记住,我只编写了 2 周的代码,我找不到任何关于如何使用递归函数调用中的 hidden/extra 参数初始化变量的信息。可能吗?而且,如果可能的话,是否存在这样做是最佳做法的情况?


这个问题是在我对 CoderByte challenge number 10(字母汤 - 输入一个字符串和 return 一个相同长度的按字母顺序排列的字符串的超级不优雅的回答时弄糊涂的). [注意:是的,我知道我的回答很愚蠢,而且有更好的方法来解决问题。我不需要帮助解决这个问题。我只是将这段代码作为我的问题的上下文。]

本质上,我想问的是是否有一种方法可以删除 newStr 作为参数(因为 Java 脚本函数可以接受额外的参数)并且仍然传递递归增长的答案字符串?如果我简单地删除 newStr 作为参数,则 newStr 不再初始化。但是,如果我在函数体中初始化 newString (var newStr = "") ,我就不能继续递归地传递我的排序字符串。如果有办法做到这一点,是否存在这种方法有意义的用例?或者,这只是一个标志,上面写着 "Do it another way."

完整代码:

function AlphabetSoup(str, newStr) { 
  var alphabet = "abcdefghijklmnopqrstuvwxyz";
  var testVal= 0;
  //I'M ATTEMPTING TO PASS THROUGH AN ANSWER STRING THAT IS GROWING RECURSIVELY
  if (newStr == null)
    var newStr = "";
  if (str.length == 0)
    return newStr;
  for (var i = 1; i < str.length; i++) {
    if (alphabet.indexOf(str[0]) <= alphabet.indexOf(str[i])) {
      testVal += 1;
    }
  }
  // When the first letter, str[0], is ealier in the alphabet than every other letter
  if (testVal == (str.length - 1)) {
    //add the first letter to the newStr
    newStr = newStr + str[0];
    //remove the first letter from the input string
    str = str.substr(1);
    //recursively call AlphabetSoup to continue building newStr
    return AlphabetSoup(str, newStr);
  }
  //When the first letter isn't the earliest in the alphabet
  else {
    //put in in the back of str
    str = str.substr(1) + str[0];
    //until we find the next letter earliest in the alphabet
    return AlphabetSoup(str, newStr);
  }
}

console.log(AlphabetSoup("hooplah"));

当然你可以检查 arguments.length 并用 arguments[1] 初始化你的变量,如果这就是你所指的“JavaScript 函数可以接受额外的参数”,但这会相当粗糙。在那里进行这种争论并没有错。如果您不想将它暴露给您的调用者,请将您的递归函数包装在另一个只有一个参数的函数中。

一开始就检查newStr的想法是JS中的常见模式。但是不要检查它是否是 null,而是 undefined:

if (typeof newStr == "undefined") {
    var newStr = "";
}

如果您编写 ES6(或 Coffeescript),您的参数可以有默认值:

function AlphabetSoup(str, newStr = '') {
    // ...
}