MST

星途 面试题库

面试题:JavaScript块级作用域与变量声明的深度探究

ES6引入块级作用域后,let和const声明的变量与var声明的变量在块级作用域中的行为有何不同?请通过代码示例说明,并解释造成这些差异的原因。
18.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. 作用域区别

  • var:没有块级作用域概念,会发生变量提升。
{
    var num = 10;
}
console.log(num); // 10

在上述代码中,var声明的num虽然在块级作用域内,但由于没有块级作用域限制,外部仍可访问。

  • let 和 const:具有块级作用域。
{
    let num = 10;
}
console.log(num); // ReferenceError: num is not defined

这里let声明的num只在块级作用域内有效,外部访问会报错。

2. 变量提升区别

  • var:会变量提升,即变量声明会被提升到函数或全局作用域的顶部,但是赋值不会提升。
console.log(num); // undefined
var num = 10;

先访问num,由于变量提升,num声明被提升到顶部,但未赋值,所以是undefined

  • let 和 const:不存在变量提升,在声明之前访问会报错(暂时性死区)。
console.log(num); // ReferenceError: Cannot access 'num' before initialization
let num = 10;

let声明之前访问num,会触发暂时性死区错误。

3. 重复声明区别

  • var:允许在同一作用域内重复声明变量。
var num = 10;
var num = 20;
console.log(num); // 20

重复声明不会报错,后面的声明会覆盖前面的声明。

  • let 和 const:不允许在同一作用域内重复声明变量。
let num = 10;
let num = 20; // SyntaxError: Identifier 'num' has already been declared

let重复声明会报错。const同理。

4. 原因

var的设计源于JavaScript早期,旨在模仿C语言函数作用域的行为,但这种设计导致了一些不符合预期的行为。而letconst的引入是为了让JavaScript的作用域规则更符合其他现代编程语言,通过块级作用域、不提升变量声明等特性,避免变量提升导致的意外行为,增强代码的可维护性和可读性。同时,const为常量声明提供了块级作用域的支持,确保在块内声明的常量有正确的作用域范围。