【问题标题】:Variable assignment within return statement, is it legal?return 语句中的变量赋值,合法吗?
【发布时间】:2019-11-24 17:55:43
【问题描述】:

下面两段代码有什么区别吗?

我想知道哪个是最佳做法。在 Block 2 中这样的 return 语句中声明一个新变量是否合法?

第 1 块:

function caseInSwitch(num) {
  let answer = "";
  switch (num) {
    case 1:
      return answer += "alpha";
    case 2:
      return answer += "beta";
    case 3:
      return answer += "gamma";
    case 4:
      return answer += "delta";
  }
}
console.log(caseInSwitch(3)); //output gamma
console.log(answer); //output gamma

第 2 块:

function caseInSwitch(num) {
  switch (num) {
    case 1:
      return answer = "alpha";
    case 2:
      return answer = "beta";
    case 3:
      return answer = "gamma";
    case 4:
      return answer = "delta";
  }
}
console.log(caseInSwitch(3)); //output gamma
console.log(answer); //output gamma

如您所见,我已经尝试了这两种方法,它们在控制台中产生了相同的结果。

【问题讨论】:

  • 为什么不直接return "alpha"?
  • 对于第 1 块,console.log(answer);应该返回未定义,因为它是在函数中用let定义的,所以它不存在于外部范围内。对于块2,它等于定义了一个全局变量answer。
  • @AppleJam 您应该将其发布为答案
  • 这些都不是“最佳”实践。我只是把它写出来,这样就可以清楚地看到发生了什么,如果需要的话,可以使用多行。
  • 错误陈述:“两者 [...] 在控制台中产生相同的结果”。您是否在第 1 块按“运行代码 sn-p”? ;-)

标签: javascript variables return


【解决方案1】:

在第 1 块中,您的代码将两个字符串连接在一起,其中第 2 块您的代码正在为变量赋值。我建议使用 Block 2,因为 Block 1 不是最佳实践。

【讨论】:

    【解决方案2】:

    我认为您可以执行以下操作。没有什么比合法的了。做最兼容的方式。

    function caseInSwitch(num) {
      let answer = "";
      switch (num) {
        case 1:
          answer += "alpha";
          break;
        case 2:
          answer += "beta";
          break;
        case 3:
          answer += "gamma";
          break;
        case 4:
          answer += "delta";
          break;
      }
      return answer;
    }
    

    【讨论】:

      【解决方案3】:

      在我看来,这两种做法都不是很好的做法。

      这两个选项都使用了多个返回路径,只能是done with caution。

      您的第二个选项使用未声明的变量,因此是全局变量。全局变量是不好的做法:Why are global variables considered bad practice?

      此外,并非所有路径都返回一个值,这又被认为是一种不好的做法,如果参数无效,您的函数应该返回什么?它应该返回一些东西。

      Melvins answer 几乎是我的做法,但我不会连接字符串。

      function caseInSwitch(num) {
        let answer = "";
        switch (num) {
          case 1:
            answer = "alpha";
            break;
          case 2:
            answer = "beta";
            break;
          case 3:
            answer = "gamma";
            break;
          case 4:
            answer = "delta";
            break;
        }
        return answer;
      }
      
      console.log("1 " + caseInSwitch(1));
      console.log("7 " + caseInSwitch(7))

      其他选项可能是删除 switch 语句并使用数组或关联数组

       function fromArray(num) {
            let answers = ["alpha", "beta", "gamma", "delta"];
            
            return (typeof answers[num-1] === 'undefined') ? "Not Found" : answers[num-1];
          }
          
       function fromAssocArray(num) {
            let answers = {1:"alpha", 2:"beta", 3:"gamma", 4:"delta"};
            
            return answers.hasOwnProperty(num) ?  answers[num] : "N/A";
          }    
      
          console.log("1 " + fromArray(1));
          console.log("7 " + fromArray(7));
          console.log("---------- Associated Array Below --------------");
          console.log("1 " + fromAssocArray(1));
          console.log("7 " + fromAssocArray(7));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-13
        • 2016-05-17
        • 2020-06-27
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        相关资源
        最近更新 更多