web标准的制定者是 谈谈你不知道的 JavaScript 知识

JavaScript(简称js)在Web开发领域应用非常广泛,几乎是Web开发的唯一编程语言。近年来随着node.js的快速发展,js在服务器领域也得到了广泛的应用和拓展。

不过虽然js无论在前端还是后端都取得了一定的进步,而且很多js开发人员能够熟练使用大量js代码库,但是很多人还是无法理清js的各种关键术语。

本文并不讲解具体的开发技术和技巧,而只是讲解知识点,帮助大家理解这些关键术语的内涵。

ECMAScript

在js前端面试中,ES永远是一个绕不开的话题,那么ES到底是什么呢?

图片[1]-web标准的制定者是 谈谈你不知道的 JavaScript 知识-唐朝资源网

从名词解释

ECMAScript 是由 Ecma International 通过 ECMA-262 标准化的脚本编程语言。

ES更像是一套标准,而不是一种语言定义,我们所说的js就是ES的一种实现,历史上也有其他语言实现过ES的标准,比如在flash上​​运行的actionscript。

ES不等于js。

图片[2]-web标准的制定者是 谈谈你不知道的 JavaScript 知识-唐朝资源网

ES几乎涵盖了js的所有语法方面,记住语法,并举几个例子。

这显然不是 ES 标准,那么为什么所有浏览器都实现了它?

这涉及到另一个标准委员会——W3C 标准委员会。

而对于node.js来说,为了保证大部分js库可以不经过修改就移植到node环境中(吸引js开发者),内部也实现了这两个定时器函数,不过网络库却由另一套模块来实现。

图片[3]-web标准的制定者是 谈谈你不知道的 JavaScript 知识-唐朝资源网

事件循环

js事件循环是基于js单线程体系的最优设计(后面我会单独讲解js事件循环的具体原理)。

在ES6之前,js的事件循环非常单调,除了异步IO、网络、定时器,几乎没有什么可讲的。在ES6之后,事件循环中多了两个概念:微任务队列和宏任务队列。比如Promise的底层实现就离不开微任务队列,ES标准如果想包含Promise协程,就必须把微任务队列加入到标准中。

我们还知道 setTimeout/setInterval 与宏任务队列相关联。但请记住,宏任务不是 ES 标准。

图片[4]-web标准的制定者是 谈谈你不知道的 JavaScript 知识-唐朝资源网

所有的js引擎都没有提供任何宏任务队列的API接口,比如v8(Chrome和node.js背后的js引擎),JSC(Safari浏览器js引擎),SpiderMonkey等,在它们里面你根本找不到宏任务实现接口,宏任务队列完全是由引擎上层设计的。

例如在Chrome浏览器中,事件循环必须提供渲染调度的接口,但在node.js中,则不需要渲染。

其实浏览器和node.js中宏任务的实现原理有很大的不同web标准的制定者是,Node.js依赖libuv库来驱动事件循环。

那么有人就有疑问了,既然不是标准,那为什么所有浏览器和node的js执行环境都提供了宏任务队列呢?

图片[5]-web标准的制定者是 谈谈你不知道的 JavaScript 知识-唐朝资源网

这又回到上面的第一句话:js事件循环是基于js单线程体系的最优设计,宏任务队列是各大巨头约定俗成的不成文标准,不属于ES或者W3C。

W3C

严格来说,W3C并不定义或规范JS标准,它只负责制定Web标准并要求浏览器实现,比如HTML5标准。

W3C讨论的标准肯定是基于js来制定的。

例如网络请求fetch API时web标准的制定者是,fetch返回一个Promise,ES6标准之后才可以使用。

所以,我们可以说ES是一个不能直接使用的标准,JS是基于ES标准可以使用但是需要宿主环境的编程语言,而W3C标准负责制定web标准规范,而这个标准规范的实现又依赖于js。这三者是一层层具体的。

© 版权声明
THE END
喜欢就支持一下吧
点赞234赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容