最近在学前端,发现这玩意不比java简单多少…
let和const出现,才让js明朗起来,但是很容易跟var混掉,我发现从java角度理解let和const会出奇的通透,
这里以let为例
先说结论二者非常相似
相同点:
1.块级作用域:
JavaScript 的 let
和 Java 的局部变量(如在方法、循环或 if
语句中声明的变量)都是块级作用域。它们只在声明的代码块 {}
内有效。例如,以下代码在两种语言中都适用:
if (true) {
let x = 10;
}
console.log(x); // 报错:x is not defined
if (true) {
int x = 10;
}
System.out.println(x); // 报错:x cannot be resolved to a variable
在这两种情况下,x
只能在 if
块内部访问,出了块就无法访问。
2.避免变量提升:
JavaScript 中的 let
不会像 var
那样发生变量提升,而是遵循块级作用域,这一点和 Java 一致。
console.log(x); // ReferenceError: x is not defined
let x = 10;
console.log(y); // 输出 undefined
var y = 10;
Java 中的变量声明也不会提升,因此在声明之前使用变量会导致编译错误。
System.out.println(x); // 编译错误:x 可能尚未初始化
int x = 10;
不同点:
1.生命周期不同(GC差异)
JavaScript 一旦执行离开块,let
变量就会被销毁,但只有在没有引用时,垃圾回收器才会将内存释放,
在 Java 中,变量的生命周期取决于它的声明位置和类型。局部变量在本块执行结束后立即被销毁。对于实参,当对象被垃圾回收时,实例变量也会被销毁
2.作用域嵌套的细节差异:
JavaScript 中 let
允许在不同的嵌套作用域中声明同名变量。
{
let x = 10;
{
let x = 20; // 合法,在不同的块作用域中
}
}
Java 不允许在嵌套作用域中声明同名的局部变量。
{
int x = 10;
{
int x = 20; // 编译错误:变量 x 已在作用域中定义
}
}