众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但这是在任何标准中指定的还是只是传统?假设JavaScript总是单线程的,这是完全安全的吗?
当前回答
尝试在彼此内嵌套两个setTimeout函数,它们将表现为多线程(即;外部计时器在执行其功能之前不会等待内部计时器完成)。
其他回答
Javascript引擎必须是单线程,但Javascript运行时不需要是单线程。
Javascript引擎是什么?这是执行实际JS代码的解释器。引擎需要主机。它不能自己运行。主机是Javascript运行时。
例如,运行在Chrome浏览器中的V8引擎是单线程的。Chrome浏览器是一个运行时&它有其他进程/线程支持V8引擎。
你可以查看这篇文章,在那里有漂亮的解释。如果有帮助的话,别忘了回复并点赞:)
是的,尽管在使用任何异步api(如setInterval和xmlhttp回调)时仍然会遇到并发编程的一些问题(主要是竞争条件)。
我的答案是肯定的——因为如果浏览器的javascript引擎异步运行,几乎所有现有的(至少所有非平凡的)javascript代码都会崩溃。
再加上HTML5已经指定了Web Workers(用于多线程javascript代码的显式标准化API),在基本javascript中引入多线程是毫无意义的。
(请其他评论者注意:即使setTimeout/setInterval, http请求onload事件(XHR),和UI事件(点击,聚焦等)提供了一个多线程的粗略印象-他们仍然都是沿着单一的时间轴执行-一次一个-所以即使我们事先不知道他们的执行顺序,也没有必要担心外部条件在事件处理程序,定时函数或XHR回调的执行过程中发生变化。)
是的,尽管Internet Explorer 9会在一个单独的线程上编译你的Javascript,为在主线程上执行做准备。但是,对于作为程序员的您来说,这并没有任何改变。
JavaScript/ECMAScript被设计为存在于宿主环境中。也就是说,除非宿主环境决定解析和执行给定的脚本,并提供让JavaScript真正有用的环境对象(例如浏览器中的DOM),否则JavaScript实际上什么也不做。
我认为给定的函数或脚本块将逐行执行,这是JavaScript的保证。然而,宿主环境可能同时执行多个脚本。或者,宿主环境可以始终提供一个提供多线程的对象。setTimeout和setInterval是一些例子,或者至少是伪例子,它们说明一个主机环境提供了一种实现并发性的方法(即使它不是真正的并发性)。
推荐文章
- javascript toISOString()忽略时区偏移
- 如何在JavaScript中获得当前时间
- 我如何从一个元标签与JavaScript的信息?
- 匹配精确字符串
- Haskell对Node.js的响应是什么?
- 用JavaScript创建一个基于字符串的十六进制颜色
- JavaScript数据网格数百万行
- 我可以在JavaScript中获得当前运行函数的名称吗?
- 如何防止输入键提交网页表单?
- 在html文本框中设置键盘插入符号的位置
- 使用jQuery选择多个类
- Cypress:只运行一个测试
- 如何同步确定JavaScript Promise的状态?
- 在Link react-router中传递道具
- 我如何承诺本地XHR?