2

MDNでは、次のように述べられています。

finally ブロックが値を返す場合、この値は、try および catch ブロック内の return ステートメントに関係なく、try-catch-finally プロダクション全体の戻り値になります。

だから私は次のコードを実行しようとします、

function an(){
    var r = try{
        throw 1;
    } catch(e){
        console.log("Caught: %o", e);
    } finally {
        return 2;
    }
    console.log("r=%o", r);
    return 3;
}

それは動作しません。構文エラーをスローします。

SyntaxError: syntax error

    var r = try{

ここで何が問題なのですか?

4

3 に答える 3

6

問題は、try ステートメントを変数に代入しようとしているだけだと思います。私が知る限り (そして私は JS の専門家ではありません)、それはできません。表現ではなく発言です。

これは、戻り値で起こることとはまったく別のものだと思います。

try/catch/finally ステートメントを別の関数に入れて、代わりにそれを呼び出して、結果を r に代入してみてください。

function foo() {
    try {
        throw 1;
    } catch(e) {
        console.log("Caught: %o", e);
    } finally {
        return 2;
    }
}

var r = foo();
console.log("r=%o", r);

Chrome の Javascript コンソールでは、次のようになります。

Caught: 1
r=2

編集: ドキュメント内の「プロダクション」という用語がここでは少し混乱していることに同意します。コメントによると、それは技術的に正確ですが、もちろん、それで混乱することはありません。ほとんどの場合、「機能」はより明確であり、おそらく決定的に正確ではないのではないかと思います。

于 2013-06-08T10:25:31.337 に答える
1

あなたの仮定は間違っています。構文エラーがあります。tryブロックは何も返しません。

function an(){
var r;// <---- here
try{// <----- here
    throw 1;
} catch(e){
    console.log("Caught: %o", e);
} finally {
    return 2;
}
console.log("r=%o", r);
return 3;
}
于 2013-06-08T10:26:31.097 に答える
1

彼らが意味することはこれです:

function an() {
    try {
        throw 999;
        return "in try";
    } catch(e) {
        return "in catch";
    } finally {
        return "in finally";
    }
    return "in func";
}

console.log(an()) // in finally

JS はreturn、finally ブロック内のステートメントを除くすべてのステートメントを無視します。

于 2013-06-08T10:26:32.650 に答える