这是一个深思熟虑的设计决定,还是我们当前浏览器的一个问题,这个问题将在未来的版本中得到纠正?
当前回答
我不知道这个决定的基本原理,但我知道可以使用setTimeout模拟多线程编程的一些好处。您可以给人一种错觉,认为多个进程同时在做事情,但实际上,所有事情都发生在一个线程中。
只需要让你的函数做一点工作,然后调用类似这样的东西:
setTimeout(function () {
... do the rest of the work...
}, 0);
任何其他需要做的事情(如UI更新,动画图像等)都会在他们有机会的时候发生。
其他回答
实际上多线程与语言本身没有关系。 这是一个。net的多线程Javascript引擎。 它在多线程场景下工作得非常好。 它集成了c#运行时,所以所有的同步逻辑都类似于c#。可以启动/等待/等待任务,也可以启动线程。你甚至可以放锁。下面的示例演示了在。net运行时中使用Javascript语法的并行循环。
https://github.com/koculu/topaz
var engine = new TopazEngine();
engine.AddType(typeof(Console), "Console");
topazEngine.AddType(typeof(Parallel), "Parallel");
engine.ExecuteScript(@"
var sharedVariable = 0
function f1(i) {
sharedVariable = i
}
Parallel.For(0, 100000 , f1)
Console.WriteLine(`Final value: {sharedVariable}`);
");
除此之外,微软正在开发Napa.js,一个支持多线程的Node.js克隆。
https://github.com/microsoft/napajs
你的意思是为什么语言不支持多线程,或者为什么浏览器中的JavaScript引擎不支持多线程?
第一个问题的答案是,浏览器中的JavaScript是在沙盒中运行的,以一种独立于机器/操作系统的方式运行,添加多线程支持会使语言变得复杂,并将语言与操作系统联系得太紧密。
我不知道这个决定的基本原理,但我知道可以使用setTimeout模拟多线程编程的一些好处。您可以给人一种错觉,认为多个进程同时在做事情,但实际上,所有事情都发生在一个线程中。
只需要让你的函数做一点工作,然后调用类似这样的东西:
setTimeout(function () {
... do the rest of the work...
}, 0);
任何其他需要做的事情(如UI更新,动画图像等)都会在他们有机会的时候发生。
Javascript是一种单线程语言。这意味着它有一个调用堆栈和一个内存堆。正如预期的那样,它按顺序执行代码,并且必须在执行下一段代码之前完成。它是同步的,但有时是有害的。例如,如果一个函数需要一段时间才能执行,或者必须等待某项操作,那么它会同时冻结所有内容。
目前一些浏览器确实支持多线程。如果你需要,你可以使用特定的库。例如,查看下面的材料:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers (支持后台线程); https://keithwhor.github.io/multithread.js/(图书馆)。
推荐文章
- 如何写setTimeout与参数Coffeescript
- 将JavaScript字符串中的多个空格替换为单个空格
- 每n秒运行特定代码
- JavaScript: override alert()
- 重置setTimeout
- 如何确保<select>表单字段被禁用时提交?
- jQuery有不聚焦的方法吗?
- 反应钩子-正确的方式清除超时和间隔
- TypeScript枚举对象数组
- 在React.js中正确的img路径
- 在React.js中更新组件onScroll的样式
- onClick ReactJS调用多个函数
- 如何在JavaScript中转义单引号(')?
- Ng-repeat结束事件
- 谷歌MAP API未捕获的类型错误:无法读取属性“offsetWidth”为空