语句执行和表达式执行
语句强调的是完成时的状态,表达式是用来求值的。这正是命令式范型与函数式范型的区别。
语句执行
在语句执行的层面,它返回一个语句的完成状态,这个状态中包括了一个 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 技术交流群。
上一篇: JS 特殊的可执行结构
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论