首页 > 其他分享 >以下代码执行后,输出结果为 抛出ReferenceError

以下代码执行后,输出结果为 抛出ReferenceError

时间:2023-11-10 13:12:07浏览次数:40  
标签:变量 作用域 抛出 let 代码执行 声明 ReferenceError

let x = 10;
let foo = () => {
    console.log(x);
    let x = 20;
    x++;
}
foo();

使用let声明的变量,既不会发生变量提升,同时又存在“暂时性死区”,所以在块级作用域内,如果使用let声明一个变量,那么该变量在声明之前是不可用的,否则会抛出ReferenceError异常

一楼的回答说:”let块级作用域,所以不会去访问外部的x“ 是错误的,这题的本质是暂时死区的问题

如图,我单单是去掉了在function中let的定义

这里边的console.log的结果是1,证明了是可以访问function之前定义的变量的,

而之所以会产生reference error是因为暂时死区的问题(temperal dead zone),我为此查了下红宝书,

就是说虽然let语句不像var语句会产生hoisting(变量提升),JavaScript引擎也会意识到在后边的let定义,只是不支持在let声明语句之前引用该变量而已。所以,只要在同一个block中,let是在后边定义的,就不能在之前引用该变量。与此同时,也不能再去取嵌套外层的值了(x=1)

let :1.不存在变量提升
2.暂时性死区,使用let命令声明变量之前,该变量都是不可用的
3.不允许重复声明,不允许在相同作用域内,重复声明同一个变量

在解析代码时,JavaScript引擎也会注意出现在块后面的let声明,只不过在此之前不能以任何方式来引用未声明的变量。在let声明之前的执行瞬间被称为“暂时性死区”(temporal dead zone),在此阶段引用任何后面才声明的变量都会抛出ReferenceError。

标签:变量,作用域,抛出,let,代码执行,声明,ReferenceError
From: https://www.cnblogs.com/longmo666/p/17823865.html

相关文章

  • 1. 客户端代码执行流程
    目录1.GIT拉取客户端代码2.tf配置文件结构2.1backend.tf配置terraform状态文件存储在哪(localAWSS3...)2.2main.tfterraform入口文件2.3provider.tf配置terraform供应商2.4terraform.tfvars以及variables.tf配置变量2.5总结1.GIT拉取客户端代码https://wwwin-......
  • nextjs运行报错ReferenceError: Request is not defined
    安装npxcreate-next-app@latest运行npmrundev使用node版本v16.20.1,报错:ReferenceError:Requestisnotdefined 解决方案:切换node:v18.16.1(npm:v9.5.1)重新安装项目并运行,成功!......
  • 在Python中手动引发(抛出)异常
    内容来自DOChttps://q.houxu6.top/?s=在Python中手动引发(抛出)异常如何在Python中引发异常,以便稍后可以通过except块捕获?在Python中,可以使用raise语句来引发异常。要通过except块捕获异常,需要使用适当的异常类型并提供一个错误消息。以下是一个示例:try:#这里是可能引......
  • Java 静态代码块、代码块、构造方法和多态继承的代码执行顺序
    测试代码importlombok.Getter;publicclassExecutionOrder{{System.out.println("ExecutionOrdercode0");}static{System.out.println("ExecutionOrderstaticcode");}{System.out.println(&......
  • Toast自定义颜色抛出空指针异常
    首页沸点课程直播活动竞赛商城APP插件 创作者中心 会员登录 注册  实战Android升级目标版本到30过程中遇到的问题及解决办法开发者如是说2021-11-162,006阅读5分钟 专栏: Android开发文章合集 ......
  • ConcurrentModificationException异常,for循环遍历时候, add或者remove减少集合的元素时
    ConcurrentModificationException异常一:ConcurrentModificationException异常:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。二:遍历list集合时删除元素出现的异常publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<String>();......
  • Java基础 抛出异常(throws 和 throw)
    throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常(编译时异常:必须要写;运行时异常:可以不写)语法:public void 方法() throws 异常类名1, 异常类名2...{}  throw:写在方法内,表示结束方法。用来手动抛出异常对象,把异常对象交给调用者处......
  • 关于tomcat容器抛出的异常解决方案之一
    1,描述问题类型:调试信息泄露如:现要求:前端页面不显示调试信息。解决方案:替换默认的tomcat<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><e......
  • jfinal框架下,连接国产达梦数据库,抛出SocketTimeoutException异常
    公司为政府开发项目,主框架选择springboot,orm框架使用jfinal。数据库为国产达梦数据库写统计类服务时,通常sql运行时间会比较久,超过10s的sql一定会报SocketTimeoutException异常 尝试使用原生jdbc创建连接,运行sql毫无问题。遂检查连接池设置。jfinal使用druid连接池网上搜索......
  • 抛出异常 和 元类
    1.主动抛出异常异常的组成:1.Traceback:追溯信息,可以定位到错误发生的位置2.错误类型:XXXError(TypeError、KeyError、IndexError等)3.错误的原因:通过这部分我们可以很精准的找到错误的具体原因,这块对我们解决问题是最重要的主动抛出异常:我们自己有时候也......