MST

星途 面试题库

面试题:JavaScript块级作用域与变量声明初始化

在ES6引入块级作用域之前,JavaScript没有真正的块级作用域。请分析以下代码在ES5和ES6环境下的执行结果及原因:`{ var a = 1; let b = 2; console.log(a); console.log(b); } console.log(a); console.log(b);`。并阐述在块级作用域中变量声明与初始化的特点。
12.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

ES5环境下执行结果及原因

  1. 执行结果
    • 块级作用域内console.log(a)输出1
    • 块级作用域内console.log(b)报错,提示b is not defined
    • 块级作用域外console.log(a)输出1
    • 块级作用域外console.log(b)报错,提示b is not defined
  2. 原因
    • 在ES5中没有块级作用域,var声明的变量会发生提升,所以var a = 1实际上是先声明a,然后在块级作用域内赋值为1,并且a在全局作用域中也有效,所以块级作用域内外console.log(a)都能输出1
    • let b = 2在ES5中是不被识别的合法声明方式,所以会报错b is not defined

ES6环境下执行结果及原因

  1. 执行结果
    • 块级作用域内console.log(a)输出1
    • 块级作用域内console.log(b)输出2
    • 块级作用域外console.log(a)输出1
    • 块级作用域外console.log(b)报错,提示b is not defined
  2. 原因
    • var a = 1var声明的变量依然会提升,并且在ES6中虽然引入了块级作用域,但var声明的变量还是全局作用域或函数作用域,所以块级作用域内外console.log(a)都能输出1
    • let b = 2let声明的变量具有块级作用域,在块级作用域内声明并初始化b2,所以块级作用域内console.log(b)能输出2,而块级作用域外超出了b的作用域,所以console.log(b)会报错b is not defined

块级作用域中变量声明与初始化的特点

  1. letconst声明
    • 块级作用域letconst声明的变量只在其所在的块级作用域内有效,包括{}if块、for循环块等。
    • 不存在变量提升:与var不同,letconst声明的变量不会提升到块级作用域顶部,在声明之前使用会报错,即存在“暂时性死区”。
    • 初始化要求const声明常量必须在声明时初始化,且初始化后值不能再改变;let声明变量可以先声明后初始化。
  2. var声明
    • 无块级作用域var声明的变量作用域是全局作用域或函数作用域,在块级作用域内声明的var变量实际上是在包含它的函数或全局作用域中声明的。
    • 变量提升var声明的变量会提升到作用域顶部,但赋值操作不会提升,即先声明变量,然后在代码执行到赋值语句时才进行赋值。