Javascript finally块中的return语句

Javascript finally块中的return语句,javascript,exception,try-catch,try-catch-finally,Javascript,Exception,Try Catch,Try Catch Finally,在其声明中 如果finally块返回一个值,该值将成为整个try-catch-finally产品的返回值,而不管try-and-catch块中的任何返回语句: 所以我尝试执行以下代码 function an(){ var r = try{ throw 1; } catch(e){ console.log("Caught: %o", e); } finally { return 2; } console.log

在其声明中

如果finally块返回一个值,该值将成为整个try-catch-finally产品的返回值,而不管try-and-catch块中的任何返回语句:

所以我尝试执行以下代码

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{

这里出了什么问题?

我认为问题很简单,您试图将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

编辑:我同意文档中的“生产”一词在这里有点混乱。根据评论,它在技术上是准确的——但这当然不能阻止它令人困惑。我怀疑在大多数情况下,“函数”会更清晰,可能不太准确。

你的假设是错误的。你有语法错误
try
block不返回任何内容

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;
}
函数an(){

var r;//它们的意思是:

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块中的语句。

u不能有
r=
的东西。我也猜它的try-catch是一个语句,因此没有返回值。但是MDN中的语句非常混乱。@成吉思汗:是的,它是一个语句而不是一个表达式。我怀疑在大多数情况下它是在这里只说“功能”而不是“生产”会更好,但也可能有不正确的情况。@JonSkeet:不,“生产”是正确的。问题是,JS产品,包括语句,确实有值,您不能将这些值赋给变量。@thg435所以
var x=1;
是一个返回
未定义的产品。
?@成吉思汗:它返回的“完成”等于
(正常、空、空)
()。