依据以下JS代码,在位置A打印变量a与在位置B打印变量a各会有怎样的输出?
var a = 1;
function test(){
// 位置A
class a {}
// 位置B
}
test();
A
1、class a {}
B
报错、class a {}
C
报错、报错
D
1、报错
正确答案:B
class的声明特征跟const和let类似,都是作用于块级作用域,预处理阶段则会屏蔽外部变量。因此在声明之前访问变量a都会报错,在声明之后访问才可以正常输出。
class和let一样都有暂时性死区,在被声明前无法访问
也就是在当前作用域能找到,但是要在声明后才能访问
es6中的class和let const一样都不存在提升
(实际存在提升,只是因为TDZ的作用,并不会像var那样得到undefined,而是直接抛出错误)
原来的代码
var a = 1;
function test(){
//console.log(a) 位置A
class a {}
// console.log(a) 位置B
}
test();
实际上提升后的
var a = 1;
function test(){
console.log(a) 位置A //在test()作用域内找得到a
//是一个class但是存在TDZ暂时性死区,访问报错
class a {}
console.log(a) 位置B //a已经声明创建出来了
}
test()