我多次听过这种说法,但就个人而言,我觉得这没有多大意义。我认为人们在实践中将JavaScript作为语言规范和JavaScript混淆(浏览器,节点等)。当然,在大多数情况下,JavaScript是在单线程环境中执行的;但AFAIK在语言规范中没有任何要求它。我认为这就像说Python被“解释”,而实际上它完全是一个实现问题。
那么,说JavaScript是一种“单线程”语言是否准确?
答案 0 :(得分:7)
通过JavaScript,您似乎意味着ECMAScript。
浏览器中已经存在多线程,使用webworkers构建,基于强大的数据隔离:工作者只通过消息传递进行通信,没有任何共享。
如果你想要更复杂的多线程,数据共享,那么现在看起来不可能。 ECMAScript中没有任何内容明确禁止多线程,但如果没有
,则无法进行多线程处理事实上ECMAScript不包含多线程这一事实足以阻止目前支持它(除了已经完成的消息传递孤立多线程,但它是一种非常有限的多线程)
你必须意识到这一点
为什么我说你很少使用它?因为大多数IO阻塞任务(文件读取,请求,数据库查询等),大多数低级任务(例如图像解码或页面呈现),大多数UI管理(带事件队列),大部分是调度(超时和间隔)是在外面完成的。
答案 1 :(得分:2)
HTML5和node.js都提供了多线程行为,但是Javascript语言中没有本机线程API,所以我想你的人为问题的答案(我的意思是,当然最好的方式,当然)是“是的,Javascript是一种单线程语言。”
答案 2 :(得分:1)
AFAIK在语言规范中没有要求如此。
在TC39中说:
在任何时间点,每个实际执行代码的代理程序最多有一个执行上下文。
在我看来,这是至关重要的保证,您永远不必同步对ECMAScript中变量的访问。当有人说语言是单线程时,这就是我期望的意思。
当然,大多数ECMAScript主机环境在其主机环境实现中使用多个线程来进行垃圾回收等操作。而且ECMAScript本身允许多个separate contexts of execution,每个线程可以由自己的线程驱动- -尽管该标准明确指出,您也可以使用同一线程来驱动所有这些驱动器。
再次,重点是您永远不必使用互斥量,信号量等来保护任何ECMAScript变量(这就是ECMAScript不提供此类功能的原因),因为该语言承诺永远不会有两个同时控制的线程访问相同的上下文。我也不知道有任何违反此承诺的JavaScript实现,尽管肯定有可能。