语句执行和表达式执行

发布于 2024-04-24 08:49:19 字数 1887 浏览 21 评论 0

语句强调的是完成时的状态,表达式是用来求值的。这正是命令式范型与函数式范型的区别。

语句执行

在语句执行的层面,它返回一个语句的完成状态,这个状态中包括了一个 value 域,它必须且必然会是 JavaScript 语言理解的类型,也就是 typeof() 所识别的所有的值。这样一来,任何 语句 代码 或 代码文本 就都可以被执行了,并且都可以使用 console.log() 输出结果给你了。

这其中最重要的一件事是,在任何语句执行并得到结果时,如果它 当时 是一个所谓的 引用 ,那么这个引用就必须先调用 GetValue(x) 来得到值,然后放到这个 value 域中去。因为 引用 是一个规范层面的东西,它不是 JavaScript 语言能理解的,也无法展示给开发者。

最后,ECMAScript 约定:可以在 value 域中放上 Empty,这表明语句执行 没有值 。它能表明有值,也能表明无值,仍然是 概念完整性 。

表达式执行

本质上是求值运算

而到了表达式执行时(注意函数调用也是表达式执行的一种),这个过程又被重来了一回。不过表达式执行会返回两个东西:它要么直接返回一个 上面的完成结果所理解的值 ,要么返回一个包含这样的值的 引用 。

你可能会说了,不对呀--你刚才还说所谓 概念的完整性 ,是 要么返回东西,要么返回没有东西 啊。

对的,在表达式执行这个体系里面, 没有东西 是所谓的 不可发现的引用(UnresolvableReference) 。

所以,完整的概念集是:值(value)、引用(Reference)和不可发现的引用(UnresolvableReference)。

所有 JavaScript 的执行都是语句执行

在 ECMAScript 规范层面,本质上所有 JavaScript 的执行都是语句执行。因此,ECMAScript 规范中对执行的描述都称为 运行期语义(Runtime Semantics) ,它描述一个 JavaScript 内部的行为或者用户逻辑的行为的过程与结果。也就是说这些运行期语义都最终会以一个完成状态(Completion)来返回。例如:

  • 一个函数的调用:调用函数--执行函数体(EvaluateBody)并得到它的 完成 结果(result)
  • 一个块语句的执行:执行块中的每行语句,得到它们的 完成 结果(result)。

这些结果(result)包括的状态有五种,称为完成的类型:normal、break、continue、return、throw。也就是说,任何语句的行为,要么是包含了有效的、可用于计算的数据值(Value):

  • 正常完成(normal)
  • 一个函数调用的返回(return):函数调用返回的是一个 type 为 Return 的完成状态,只不过它在内部方法 Call 处理之后,也已经变成了值而已。

要么是一个不可(像数据那样)用于计算或传递的纯粹状态:

  • 循环过程中的继续下次迭代(continue)
  • 中断(break)
  • 异常(throw)

表达式执行(包括函数执行),本质上都是求值运算,所以它们应当只返回值。 但是事实上所有的执行--包括函数、表达式和语句也都 同时 是可以返回完成状态,这样才能在表达式中向外抛异常,因为异常抛出就是一个完成状态。

但是 ECMAScript 对所有在表达式层面上返回的 完成状态 做了处理,相当于在语言层面上 消化了 这些状态。所以绝大多数情况下,你认为表达式执行返回的 Result 是值或引用就好了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文