class的声明特征跟const和let类似,都是作用于块级作用域,都有暂时性死区, 预处理阶段则会屏蔽外部变量。因此在声明之前访问变量a都会报错,在声明之后访问才可以正常输出。

发布时间 2023-11-15 22:47:16作者: 龙陌

依据以下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()