首页 > 解决方案 > 为什么 JavaScript try/finally 阻塞会导致函数明显返回两次?

问题描述

finally 块总是最后执行,return 语句将控制权返回到函数调用的位置。当在 try/finally 块内部一起使用时,该函数似乎返回两次而不是一次,当在 if-else 块内使用时,finally 块的返回值生效。相同的方法调用是否返回两次?

function print(value) {
    console.log(value);
    return value;
}

function testWrapped() {
    try {
        return print(true);
    } finally {
        return print(false);
    }
}

function test() {
    try {
        return true;
    } finally {
        return false;
    }
}


console.log("Result with wrapped value");
testWrapped();


console.log("Result when used inside an if statement:");
if (test()) {
    console.log("true");
} else {
    console.log("false");
}

上面的代码产生以下输出:

Result with wrapped value
true
false
Result when used inside an if statement:
false

标签: javascriptnode.jsfunctionreturn-value

解决方案


这是因为您正在使用finally而不是catch

finally 将在 try 或 catch 之后执行。

在条件块中,它将返回最后评估的项目false,并执行您的 else 块。

见:https ://www.w3schools.com/jsref/jsref_try_catch.asp

try 语句允许您定义一个代码块,以便在执行时对其进行错误测试。

如果 try 块中发生错误,catch 语句允许您定义要执行的代码块。

finally 语句允许您在 try 和 catch 之后执行代码,而不管结果如何。


推荐阅读