MST

星途 面试题库

面试题:JavaScript 函数作用域内赋值操作符的边界行为

请分析以下代码的输出结果,并解释原因。 ```javascript function test() { let a = 10; function inner() { let a = a + 5; return a; } return inner(); } console.log(test()); ``` 这里涉及到赋值操作符在函数嵌套作用域下的哪些边界条件?
17.0万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 代码输出结果分析

    • 这段代码会报错,ReferenceError: Cannot access 'a' before initialization
    • 原因是在inner函数中,let a = a + 5;这行代码尝试在变量a初始化之前访问它。在JavaScript中,使用letconst声明的变量存在暂时性死区(TDZ)。当进入一个块级作用域时,使用letconst声明的变量在声明语句之前是不能被访问的。在inner函数中,a在声明语句let a之前就被使用了,即使它的初始值依赖于自身,这是不允许的。
  2. 涉及到赋值操作符在函数嵌套作用域下的边界条件

    • 变量作用域与TDZ:在函数嵌套作用域中,letconst声明的变量具有块级作用域,并且存在暂时性死区。这意味着在变量声明之前不能访问该变量,即使在同一作用域内。这与var声明的变量不同,var声明的变量会被提升到函数作用域的顶部,但是其初始值为undefined
    • 变量的遮蔽:在inner函数中声明了a,它遮蔽了外部test函数中的a。如果没有这个内层的a声明,那么a + 5会访问到外层test函数中的a,但由于内层a的声明,在这个赋值语句中它属于内层a,而内层a在初始化前不能被访问。