面试题答案
一键面试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语言函数作用域的行为,但这种设计导致了一些不符合预期的行为。而let
和const
的引入是为了让JavaScript的作用域规则更符合其他现代编程语言,通过块级作用域、不提升变量声明等特性,避免变量提升导致的意外行为,增强代码的可维护性和可读性。同时,const
为常量声明提供了块级作用域的支持,确保在块内声明的常量有正确的作用域范围。