我可以在if块,case块中的函数中放置返回值。
为什么这不起作用:
(x == "good") ? (return("works")):"";
更新:我知道我可以这样做:
return (x == "good") ? ("works"):"";
只是想知道为什么第一种情况是不可接受的。
答案 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
而return
是statement
(好吧,反正的开头)。
在任何情况下,我所知道的任何人都不会推荐使用“表达”(读:“我想要聪明”)形式像三元表达式那样搞乱控制流。 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++;