本文为《人人都能读标准》—— ECMAScript篇的第3篇。我在这个仓库中系统地介绍了标准的阅读规则以及使用方式,并深入剖析了标准对JavaScript核心原理的描述。
ECMAScript并不是一门能够独立运行的编程语言,它必须要接入到一个宿主环境(host environment) 中才能发挥作用。
你可以把ECMAScript比作一台发动机,它提供了最核心的动力。但是光有一台发动机是无法产生价值的,你必须配合一个“宿主”设备才能充分发挥它的作用:把发动机装在风扇中,可以让扇叶旋转制造凉风;把发动机装在汽车里,可以推动汽车在马路上奔跑;把发动机装在升降机上,可以把人和货物运往高处…
ECMAScript有两个最常见的宿主:
- 作为web客户端的浏览器;
- 作为web服务端的Node.js;
实际上,在宿主实现ECMAScript引擎的过程中,并不一定要使用标准定义的概念(如执行上下文),也不需要完全依照标准定制的算法实现每个API,最终的引擎只需要在“表现层面”上与标准规定的一致即可。
其次,在ECMAScript标准中,会有一些刻意“留白”的地方(也称为延迟定义),这些留白的地方会以宿主定义(host-defined) 或实现定义(implementation-defined) 标注,表示其逻辑由接入ECMAScript的外部环境自定义,比如标准对Math.random()的定义:
21.3.2.27 Math.random():
该函数返回一个符号为正的Number值,范围大于或等于0但严格小于1,具体数值通过在该范围内进行随机选择或以近似均匀分布的方式进行伪随机选择,具体使用实现定义的算法或策略。
“宿主(host)“与”实现(implementation)“是不一样的,宿主是实现的集合,比如web浏览器是”宿主“环境,而chrome、safari、Opera这些都是”实现“环境。又因为“宿主”比“实现”更加宏观,所以宿主定义的内容比实现定义更有趣、适用范围更广、研究价值更高。
标准在