2

MDN中声明,

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

所以我尝试执行以下代码,

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 回答