深思熟虑:如果声明回归

时间:2012-05-15 20:26:02

标签: javascript

我可以在if块,case块中的函数中放置返回值。

为什么这不起作用:

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

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

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

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

8 个答案:

答案 0 :(得分:3)

你正试图这样做:

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

return不是函数,因此return(“works”)不正确。 或者你也可以这样做:

var x = "bad";

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

return y;

但这更详细。所以要回答你的问题,你可以把函数放在任何地方,但是之后的任何东西都不会被执行。所以

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 "";

}

答案 1 :(得分:3)

这是因为grammar of a ternary operation is this

  

条件? expr1:expr2

并且返回声明在技术上不被视为表达式。


编辑:这里有更多信息。以上就语言的语法进行了解释,但这里有一些关于原因的推理。

我之前实际上已经挖过这个,因为我一直认为能够做到这样的事情会很酷:

someFlag && return;

而不是

if (someFlag) return;

然而,问题在于表达总是需要评估某些东西。但是,这个要求与return语句的作用不一致,它与(可选地)返回结果一起立即终止当前函数的执行。如果它确实是一个表达式,那么当前函数的终止在逻辑上与评估return语句本身的值的需要不一致。

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

答案 2 :(得分:2)

return关键字应首先出现:

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

原因是return x;是一个陈述。您不能将(return x)用作表达式。

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

答案 3 :(得分:0)

你是说x是“好”,然后返回,否则什么都不做?在那种情况下,

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

诀窍。此外,return不是函数,它是一个javascript标记,因此return不能使用括号。

答案 4 :(得分:0)

return keyword标志着陈述的开始。它不是一个表达式,可以与ternary operator一起使用。

答案 5 :(得分:0)

基于此grammar 的javascript,三元运算符定义为:

OrExpression ? AssignmentExpression : AssignmentExpression

returnstatement(好吧,反正的开头)。

在任何情况下,我所知道的任何人都不会推荐使用“表达”(读:“我想要聪明”)形式像三元表达式那样搞乱控制流。 if语句的字符数相同:

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

答案 6 :(得分:0)

因为"Almost everything is an expression"还没有使用它。

答案 7 :(得分:-1)

所有以“返回”开头的答案都与我认为OP在他的三元操作中的行为有所不同。我猜OP想要

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

表示

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

它没有这样做,因为格式是

statement1 ? statement2 : statement3;

所有陈述都可能有副作用,但只有返回值(在statement1的情况下,只是它的真实性)由三元运算符考虑。

即使是? :最好用“if”和“then”来阅读,当更接近语法水平时,它应被视为一种表达,它会影响副作用和返回值。如果您了解x ++和++ x之间的区别,您将能够理解三元运算符。

举例来说,出于同样的原因,这里有一些非法的非法陈述。

if( (return 5) == 5) {
     //...
}

if (loadUserStats(return userId)) == "FAILED") {
    throw error("oops");
}

x = return  y++;