JavaScript 中 try 块中变量作用域范围
在 javascript 中,`try` 块内部声明的变量遵循所在代码块的词法作用域规则。如果 `var` 关键字用于声明变量,其作用域会提升到包含该 `try` 块的最外层函数或全局作用域;而使用 `let` 或 `const` 声明时,变量严格限制在 `try` 块的大括号内,外部无法访问。

var 声明在 try 块中的提升行为
当在 `try` 块中使用 `var` 声明变量时,由于 `var` 不具备块级作用域,变量会被提升到当前执行上下文的顶部。这意味着即使 `try` 块因异常中断,该变量依然可以在 `try` 块外部的同层代码中被访问到,尽管其值可能尚未被赋值。

function testVar() {
try {
var x = 10;
throw new Error("error");
} catch (e) {
console.log("In catch");
}
// x is accessible here
console.log(x);
}
testVar();
let 和 const 的块级作用域隔离
ES6 引入的 `let` 和 `const` 具有严格的块级作用域。在 `try` 块内声明的这些变量仅在该块内有效。一旦执行流离开 `try` 块(无论是正常结束还是抛出异常),这些变量就会从作用域中销毁,外部引用将导致 `ReferenceError`。

function testLet() {
try {
let y = 20;
throw new Error("error");
} catch (e) {
console.log("In catch");
}
// ReferenceError: y is not defined
console.log(y);
}
testLet();
基于 try-catch-finally 执行顺序的具体问题
在涉及 `finally` 块的复杂场景中,变量的最终状态取决于 `finally` 是否修改了它。如果 `finally` 块中对 `try` 或 `catch` 中定义的变量进行了重新赋值,这个修改会反映在函数返回或后续逻辑中,因为变量本身的作用域并未因 `try/catch/finally` 的结构而改变(针对 `var`)或依然可见(针对 `let/const` 在同一层级)。例如,若 `finally` 块中修改了 `var` 声明的变量,外部获取的是修改后的值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











