面试题答案
一键面试-
代码输出结果分析:
- 这段代码会报错,
ReferenceError: Cannot access 'a' before initialization
。 - 原因是在
inner
函数中,let a = a + 5;
这行代码尝试在变量a
初始化之前访问它。在JavaScript中,使用let
和const
声明的变量存在暂时性死区(TDZ)。当进入一个块级作用域时,使用let
或const
声明的变量在声明语句之前是不能被访问的。在inner
函数中,a
在声明语句let a
之前就被使用了,即使它的初始值依赖于自身,这是不允许的。
- 这段代码会报错,
-
涉及到赋值操作符在函数嵌套作用域下的边界条件:
- 变量作用域与TDZ:在函数嵌套作用域中,
let
和const
声明的变量具有块级作用域,并且存在暂时性死区。这意味着在变量声明之前不能访问该变量,即使在同一作用域内。这与var
声明的变量不同,var
声明的变量会被提升到函数作用域的顶部,但是其初始值为undefined
。 - 变量的遮蔽:在
inner
函数中声明了a
,它遮蔽了外部test
函数中的a
。如果没有这个内层的a
声明,那么a + 5
会访问到外层test
函数中的a
,但由于内层a
的声明,在这个赋值语句中它属于内层a
,而内层a
在初始化前不能被访问。
- 变量作用域与TDZ:在函数嵌套作用域中,