引人深思:返回IF语句

food for thought: return in if statement

本文关键字:语句 IF 返回 引人深思      更新时间:2023-09-26

我可以在任何地方放置返回,例如在函数中,在if块中,在案例块中。

为什么这不起作用:

     (x == "good") ? (return("works")):""; 

更新:我知道我可以这样做:

     return (x == "good") ? ("works"):"";

只是想知道为什么第一种情况是不可接受的。

这是因为三元运算的语法是这样的:

条件 ? expr1 : expr2

从技术上讲,return 语句不被视为表达式。


编辑:这里有一些更多信息。上面用语言的语法来解释它,但这里有一点关于原因的推理。

我之前实际上已经深入研究过这个问题,因为我一直认为能够做这样的事情会很酷:

someFlag && return;

而不是

if (someFlag) return;

然而,问题在于表达式总是需要计算到某物。然而,此要求与 return 语句的角色不一致,它与(可选(返回结果一起,也会立即终止当前函数的执行。 当前函数的这种终止在逻辑上与计算 return 语句本身的值的需求不一致,如果它确实是一个表达式。

鉴于这种不一致,语言作者显然选择不允许返回语句充当表达式。 希望我设法以一种有意义的方式表达出来。

您是否正在尝试这样做:

return (x == "good") ? "works":"";
return

不是一个函数,所以 return("works"( 是不正确的。或者,您也可以执行以下操作:

var x = "bad";
var y = (x=="good")? "works" : "";
return y;

但这更冗长。 因此,为了回答您的问题,您可以将 return 放在函数中的任何位置,但之后的任何内容都不会被执行。所以

function x ()
{
   var str = "";
   return "I love puppies.";
   str = "me too!" //this won't ever execute, because return exits the function.
}

唯一的例外是变量声明,因为无论您将它们放在何处,变量都会在开始时自动声明。

function y (){
  return "";
   var x; 
}

真的是:

function y (){
   var x;
   return "";
}

return关键字应该排在第一位:

return (x == "good") ? "works": ""; 

原因是return x;是一个声明。不能将(return x)用作表达式。

所有表达式都可以在需要语句的地方使用

,但并非所有语句都可以在需要表达式的地方使用。

return 关键字标记语句的开头。它不是一个表达式,你可以与三元运算符一起使用。

基于javascript的这种语法,三元运算符定义为:

OrExpression ? AssignmentExpression : AssignmentExpression

return是一个statement(好吧,无论如何,一个的开始(。

无论如何,以三元表达式这样的"表达"(阅读:"我想变得聪明"(形式弄乱控制流不会被我认识的任何人推荐。 if 语句是相同数量的字符:

  if(x==good) return x;
    (x==good)?(return x)

因为"几乎所有东西都是一种表达"还没有进入语言。

你是说如果x是"好",那么返回,否则什么都不做?在这种情况下,

if (x == "good") return "works";

能解决问题。此外,return 不是一个函数,它是一个 javascript 标记,因此不应将括号与 return 一起使用。

所有以"return"开头的答案都与我认为 OP 在他的三元操作中的意图不同。 我猜OP想要

x == "good" ? return "works" : "";

意思是

if(x == "good") {
    return works;
}
else {
    ""; //does nothing because the statement ""; has no side effects
}

它不这样做,因为格式是

statement1 ? statement2 : statement3;

所有语句都有副作用,但三元运算符只考虑返回值(在语句 1 的情况下,只是它的真实性(。

尽管 ?: 最好用"if"和"then"来理解,但在更接近语法级别时,应该将其视为考虑副作用和返回值的表达式。 如果你了解 x++ 和 ++x 之间的区别,你将能够理解三元运算符。

例如,这里有一些出于同样原因而非法的非法陈述。

if( (return 5) == 5) {
     //...
}
if (loadUserStats(return userId)) == "FAILED") {
    throw error("oops");
}
x = return  y++;