面试题答案
一键面试特殊行为产生原因
- 暂时性死区(TDZ):
- 在块级作用域内,使用
let
或const
声明的变量在声明之前的区域被称为暂时性死区。这是因为let
和const
声明的变量不会像var
那样进行提升。var
声明的变量会被提升到函数或全局作用域的顶部,但let
和const
不会,它们在声明之前不可访问。在TDZ内访问变量会抛出ReferenceError
,这是JavaScript引擎为了强化块级作用域变量的声明和初始化逻辑,防止变量在未声明就使用的情况,使得代码的行为更加可预测和符合预期的作用域规则。
- 在块级作用域内,使用
- 块级作用域特性:
let
和const
创建的是块级作用域,与var
的函数作用域不同。块级作用域限制了变量的可见性,只在包含它们的块({}
)内有效。这是为了更好地控制变量的生命周期和作用范围,避免在不必要的地方意外访问或修改变量,提高代码的模块化和可维护性。
避免因这些行为导致错误的方法
- 先声明再使用:在使用
let
或const
声明的变量之前,确保已经声明了该变量。这样可以避免进入暂时性死区。 - 合理规划作用域:清晰地界定块级作用域,确保变量的声明和使用都在合理的作用域范围内。不要在不适当的块内意外访问变量,同时避免在不同块级作用域中使用相同名称的变量导致混淆。
实际代码案例
- 暂时性死区案例:
function test() {
console.log(a); // ReferenceError: a is not defined
let a = 10;
}
test();
在上述代码中,console.log(a)
在let a = 10;
之前,处于a
的暂时性死区内,所以会抛出ReferenceError
。
- 块级作用域案例:
{
let b = 20;
console.log(b); // 20
}
console.log(b); // ReferenceError: b is not defined
在这个例子中,let b
创建了一个块级作用域,b
在块内可以正常访问和使用,但是在块外部,b
超出了作用域范围,访问会抛出ReferenceError
。这体现了块级作用域对变量可见性的限制。