関数、if ブロック、case ブロックなど、どこにでも return を配置できます。
なぜこれがうまくいかないのですか:
(x == "good") ? (return("works")):"";
更新:私はこれを行うことができることを知っています:
return (x == "good") ? ("works"):"";
最初のケースが受け入れられない理由を知りたいだけです。
関数、if ブロック、case ブロックなど、どこにでも return を配置できます。
なぜこれがうまくいかないのですか:
(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.
}
これに対する 1 つの例外は、変数の宣言です。変数は、どこに配置しても最初に自動的に宣言されるためです。
function y (){
return "";
var x;
}
本当に:
function y (){
var x;
return "";
}
これは、三項演算の文法が次のとおりであるためです。
調子 ?expr1 : expr2
また、return ステートメントは技術的には式とは見なされません。
編集:ここにいくつかの詳細があります。上記は言語の文法の観点から説明しましたが、ここでその理由について少し説明します。
次のようなことができればクールだといつも思っていたので、私は実際にこれを以前に掘り下げました。
someFlag && return;
それよりも
if (someFlag) return;
ただし、問題は、式が常に何かに評価される必要があることです。この要件は return ステートメントの役割とは相容れませんが、return ステートメントは (オプションで) 結果を返すと共に、現在の関数の実行を即座に終了させます。現在の関数のこの終了は、return ステートメント自体の値を評価する必要があることと論理的に矛盾しています (それが実際に式である場合)。
この矛盾を考慮して、言語の作成者は return ステートメントが式として機能することを許可しないことを選択したようです。理にかなった方法でそれを言葉にすることができたことを願っています。
return
キーワードが最初に来る必要があります。
return (x == "good") ? "works": "";
理由はreturn x;
発言です。(return x)
表現としては使えません。
ステートメントが必要な場所ではすべての式を使用できますが、式が必要な場所ですべてのステートメントを使用できるわけではありません。
このjavascriptの文法に基づいて、三項演算子は次のように定義されます。
OrExpression ? AssignmentExpression : AssignmentExpression
一方return
、statement
(まあ、とにかく1つの始まり)です。
いずれにせよ、三項式のような「表現力のある」(「賢くなりたい」と読む)形式で制御フローをいじることは、私が知っている人にはお勧めできません。ifステートメントは同じ量の文字です:
if(x==good) return x;
(x==good)?(return x)
「ほとんどすべてが表現である」というのは、まだ言語になっていないからです。
x が「良い」場合は戻り、それ以外の場合は何もしないと言っていますか? その場合、
if (x == "good") return "works";
トリックを行います。さらに、return
は関数ではなく、javascript トークンであるため、 では括弧を使用しないでくださいreturn
。
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++;