面试题答案
一键面试ES5环境下执行结果及原因
- 执行结果:
- 块级作用域内
console.log(a)
输出1
。 - 块级作用域内
console.log(b)
报错,提示b is not defined
。 - 块级作用域外
console.log(a)
输出1
。 - 块级作用域外
console.log(b)
报错,提示b is not defined
。
- 块级作用域内
- 原因:
- 在ES5中没有块级作用域,
var
声明的变量会发生提升,所以var a = 1
实际上是先声明a
,然后在块级作用域内赋值为1
,并且a
在全局作用域中也有效,所以块级作用域内外console.log(a)
都能输出1
。 - 而
let b = 2
在ES5中是不被识别的合法声明方式,所以会报错b is not defined
。
- 在ES5中没有块级作用域,
ES6环境下执行结果及原因
- 执行结果:
- 块级作用域内
console.log(a)
输出1
。 - 块级作用域内
console.log(b)
输出2
。 - 块级作用域外
console.log(a)
输出1
。 - 块级作用域外
console.log(b)
报错,提示b is not defined
。
- 块级作用域内
- 原因:
var a = 1
,var
声明的变量依然会提升,并且在ES6中虽然引入了块级作用域,但var
声明的变量还是全局作用域或函数作用域,所以块级作用域内外console.log(a)
都能输出1
。let b = 2
,let
声明的变量具有块级作用域,在块级作用域内声明并初始化b
为2
,所以块级作用域内console.log(b)
能输出2
,而块级作用域外超出了b
的作用域,所以console.log(b)
会报错b is not defined
。
块级作用域中变量声明与初始化的特点
let
和const
声明:- 块级作用域:
let
和const
声明的变量只在其所在的块级作用域内有效,包括{}
、if
块、for
循环块等。 - 不存在变量提升:与
var
不同,let
和const
声明的变量不会提升到块级作用域顶部,在声明之前使用会报错,即存在“暂时性死区”。 - 初始化要求:
const
声明常量必须在声明时初始化,且初始化后值不能再改变;let
声明变量可以先声明后初始化。
- 块级作用域:
var
声明:- 无块级作用域:
var
声明的变量作用域是全局作用域或函数作用域,在块级作用域内声明的var
变量实际上是在包含它的函数或全局作用域中声明的。 - 变量提升:
var
声明的变量会提升到作用域顶部,但赋值操作不会提升,即先声明变量,然后在代码执行到赋值语句时才进行赋值。
- 无块级作用域: