我可以将 return 放在任何地方,例如函数、if 块、case 块。
这怎么行不通:
(x == "good") ? (return("works")):"";
更新:我知道我可以这样做:
return (x == "good") ? ("works"):"";
只是想知道为什么第一种情况是不可接受的。
我可以将 return 放在任何地方,例如函数、if 块、case 块。
这怎么行不通:
(x == "good") ? (return("works")):"";
更新:我知道我可以这样做:
return (x == "good") ? ("works"):"";
只是想知道为什么第一种情况是不可接受的。
你想这样做吗:
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 "";
}
这是因为三元运算的语法是这样的:
健康)状况 ?expr1 : expr2
从技术上讲,return 语句不被视为表达式。
编辑:这里有更多信息。上面是根据语言的语法来解释的,但是这里稍微讲一下为什么的推理。
实际上,我之前已经对此进行了深入研究,因为我一直认为能够执行以下操作会很酷:
someFlag && return;
而不是
if (someFlag) return;
然而,问题是表达式总是需要对某些东西求值。此要求与 return 语句的角色不一致,但是,它与(可选)返回结果一起,也会立即终止当前函数的执行。如果返回语句本身确实是一个表达式,那么当前函数的这种终止在逻辑上与计算返回语句本身的值的需要不一致。
鉴于这种不一致,语言作者显然选择不允许 return 语句充当表达式。希望我设法以一种有意义的方式表达了这一点。
return
关键字应该放在第一位:
return (x == "good") ? "works": "";
原因是那return x;
是一个声明。您不能(return x)
用作表达式。
所有的表达式都可以用在需要语句的地方,但不是所有的语句都可以用在需要表达式的地方。
你是说如果 x 是“好”,然后返回,否则什么都不做?在这种情况下,
if (x == "good") return "works";
成功了。此外,return
它不是一个函数,它是一个 javascript 标记,因此不应与 . 一起使用括号return
。
基于此javascript语法,三元运算符定义为:
OrExpression ? AssignmentExpression : AssignmentExpression
而是return
一个statement
(好吧,无论如何的开始)。
无论如何,我认识的任何人都不会推荐像三元表达式这样的“富有表现力”(阅读:“我想变得聪明”)形式的控制流。if 语句是相同数量的字符:
if(x==good) return x;
(x==good)?(return x)
因为“几乎一切都是表达”还没有进入语言。
所有以“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++;