首页 > 试题广场 >

依据以下JS代码,在位置A打印变量a与在位置B打印变量a各会

[单选题]
依据以下JS代码,在位置A打印变量a与在位置B打印变量a各会有怎样的输出?
var a = 1;
function test(){
    // 位置A
class a {}
   // 位置B
}
test();


  • 1、class a {}
  • 报错、class a {}
  • 报错、报错
  • 1、报错

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()
发表于 2021-12-10 17:27:52 回复(2)
在位置a处打印时,会在函数作用域内寻找有没有a,发现是定义的类a,而类在没有声明的情况就调用就会报错
知识点:作用域 + 类声明
发表于 2022-03-07 20:52:39 回复(0)
es6中的class和let const一样都不存在变量提升,但是都有暂时性死区。

暂时性死区:
ES6 明确规定,如果区块中存在letconst命令(本题的class也和let const 一样),
这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。
凡是在声明之前就使用这些变量,就会报错。


暂时性死区可访问:https://es6.ruanyifeng.com/#docs/let
发表于 2022-01-17 17:18:33 回复(0)
暂时性死区的问题矛头都指向了一个原则:先声明,后使用,不存在变量声明提升。
发表于 2021-12-29 20:49:07 回复(0)
class和let一样都有暂时性死区,在被声明前无法访问 也就是在当前作用域能找到,但是要在声明后才能访问es6中的class和let const一样都不存在提升
发表于 2022-07-20 21:46:07 回复(0)
var a = 1;
function test(){
    console.log(a)
    // class a {}
    // console.log(a)
}
test();
如果在test的函数作用域内不声明class a的话,那么是可以沿着作用域链找到属性a
如果声明了class a ,那么在声明类a之前打印a,就会报错
发表于 2022-10-18 21:28:30 回复(0)
m
发表于 2023-03-26 23:24:49 回复(0)
位置A报错了代码还能继续执行吗?
发表于 2022-06-16 16:38:38 回复(2)
A
发表于 2022-03-13 08:28:05 回复(0)
let、const、class声明的变量,会绑定到某个块级作用域中。不会受到其他作用域的影响
使用的时候,一定要在声明的后面
发表于 2022-03-06 19:29:41 回复(0)