重学前端
程劭非(winter)
前手机淘宝前端负责人
105348 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
开篇词+学习路线+架构图 (3讲)
重学前端
15
15
1.0x
00:00/00:00
登录|注册

JavaScript执行(四):try里面放return,finally还会执行吗?

Completion Record
实验结果
树形结构的执行过程
JavaScript语句执行的原理
带标签的语句与完成记录类型中的target
带标签的语法
try和return的组合
控制语句的组合效果
外部影响
内部影响
return语句在语句块中的影响
Completion Record的[[type]]
debugger语句
空语句
表达式语句
声明类语句
try里面放return,finally还会执行吗?
结语
带标签的语句
控制型语句
语句块
普通的语句
Completion类型
JavaScript语句执行机制

该思维导图由 AI 生成,仅供参考

你好,我是 winter。
在前面几篇文章中,我们已经了解了关于执行上下文、作用域、闭包之间的关系。
今天,我们则要说一说更为细节的部分:语句。
语句是任何编程语言的基础结构,与 JavaScript 对象一样,JavaScript 语句同样具有“看起来很像其它语言,但是其实一点都不一样”的特点。
我们比较常见的语句包括变量声明、表达式、条件、循环等,这些都是大家非常熟悉的东西,对于它们的行为,我在这里就不赘述了。
为了了解 JavaScript 语句有哪些特别之处,首先我们要看一个不太常见的例子,我会通过这个例子,来向你介绍 JavaScript 语句执行机制涉及的一种基础类型:Completion 类型。

Completion 类型

我们来看一个例子。在函数 foo 中,使用了一组 try 语句。我们可以先来做一个小实验,在 try 中有 return 语句,finally 中的内容还会执行吗?我们来看一段代码。
function foo(){
try{
return 0;
} catch(err) {
} finally {
console.log("a")
}
}
console.log(foo());
通过实际试验,我们可以看到,finally 确实执行了,而且 return 语句也生效了,foo() 返回了结果 0。
虽然 return 执行了,但是函数并没有立即返回,又执行了 finally 里面的内容,这样的行为违背了很多人的直觉。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript执行(四):try里面放return,finally还会执行吗?本文深入探讨了JavaScript语句执行机制中的Completion类型,以及普通语句、语句块、控制型语句和带标签的语句等内容。通过具体的代码示例和实验,解释了在try语句中放置return时,finally中的内容是否会执行,以及finally中的return语句对try中return的影响。文章通过Completion Record类型为线索,讲解了JavaScript语句执行的原理,强调了语句执行过程实际上主要在一个树形结构上进行,根据语句的结构和Completion Record,JavaScript实现了各种分支和跳出逻辑。读者可以通过本文了解JavaScript语句执行的细节和特殊情况,以及Completion Record类型在控制语句执行过程中的作用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《重学前端》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(59)

  • 最新
  • 精选
  • csᵏᵒᵖ
    winter老师,特殊处理就是指后面的 “因为 finally 中的内容必须保证执行,所以 try/catch 执行完毕,即使得到的结果是非 normal 型的完成记录,也必须要执行 finally“ 吗

    作者回复: 没错,就是这个。

    2019-10-26
    2
    7
  • 小say
    老师你好,前面说[[value]]如果没有返回值就是empty但是为什么在Chrome调试器下显示的是undefined? 后文中语句块中 { var i = 1; // normal, empty, empty i ++; // normal, 1, empty console.log(i) //normal, undefined, empty } // normal, undefined, empty 其中 var i = 1; 为什么[[value]]会是empty?console.log(i)的[[value]]为什么是undefined?所以到底什么时候是empty什么时候是undefined?

    作者回复: 是Chrome自己的规定。

    2019-09-17
    6
  • Smallfly
    winter 老师,有什么工具能查看 JS 引擎的运行时的特殊类型么?

    作者回复: 不能,事实上引擎不一定需要按照标准的模型来实现,只要保证运行效果等效即可。

    2019-10-17
    2
  • Puru
    Python 也是先执行finally后执行return

    作者回复: 所有有这个的语言都是这个行为。

    2019-06-25
    2
    1
  • 尤璐洁
    winter老师,这些个私有属性的值执行时的值是如何得出的,是靠分析,还是说有某种方式可以看到验证呢?

    作者回复: 这是个概念模型,标准这样讲的,但是其实实现不一定这么实现,只要保证跟这个模型等效即可。

    2019-10-23
  • void function() { if(true){ console.log(1) break console.log(2) } }() 在if中用break、continue会报错VM506:4 Uncaught SyntaxError: Illegal break statement,而不是穿透,为什么和表格举出的不一致呢

    作者回复: 穿透的意思是交给外层处理,你外面没循环当然还是报错。

    2019-07-09
    3
  • 热爱减肥的胖子
    请问,上图上那个“特殊处理”怎么理解?

    作者回复: 后面一句就是特殊处理。

    2019-06-26
  • 有铭
    很感兴趣这些高级特性的知识老师是从哪里学到的,我翻过js高级编程那本书都没讲到过这些
    2019-03-02
    8
    98
  • 周小成
    穿透和消费,报错应该是连贯的,“穿透”就是指不在当前这一层处理,向外逐层寻找可以“消费”的那一层,直到最后都没找到就报错,比如:function里面有while, while里面有switch, switch里面又有continue,按图表来看,switch-continue应该是穿透,向上层寻找消费,碰到while-contine,那就是消费,再如switch里面是return, switch-return穿透,向上层whlie-return穿透,最后function-return是消费。
    2019-03-12
    3
    87
  • Rushan-Chen
    请问老师,表格中的“穿透”和“消费”是什么意思?
    2019-03-02
    13
    59
收起评论
显示
设置
留言
59
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部