同时执行JavaScript语句

时间:2011-07-13 07:23:28

标签: javascript concurrency

我们可以一起执行两个不同的语句吗?假设这些是两个陈述

x += 2*y;
y = 2*x+3*y;

在这里我们可以看到这些陈述是依赖的。那么我们可以同时执行它们吗?

3 个答案:

答案 0 :(得分:3)

理论上,依赖语句 - 即那些访问另一个修改的状态的语句 - 可以同时执行,但是你不会得到一致的结果。

但JavaScript不是并发的,即所有行都按顺序执行,即使在执行回调时也是如此。 JavaScript在浏览器中在单个线程上运行。

答案 1 :(得分:2)

一般情况下,您可以计算两个变量的总体变化并直接转到它(假设您拍摄了值的快照,以便它们之间没有实际的数据依赖性;您是否知道许多微处理器会做这是自动的,只是在代码没有数据依赖性的地方?)。使用您的示例并发明一些假的语法:

somehowInParallelWithSnapshotOf(x,y) {
    x <== 1*x + 2*y;
    y <== 2*x + 7*y;
}

但是你不能在Javascript中这样做,因为该语言不支持直接并行。 (当然,它有它的优点。首先,它大大简化了代码的语义,因此如果它们可以证明它是正确的,那么允许实现在幕后引出这样的技巧。)对于某些事情来说,这也是毫无意义的。这个例子是微不足道的;旋转额外的线程涉及(通常)很多开销,当它达到值得的时候,通常很难将表达式简化到可以使它们无危险的程度。 / p>

答案 2 :(得分:0)

如前所述,Javascript不提供并行/并发执行。这些陈述是一个接一个地顺序执行的。因此,当切换两个语句时,结果会发生变化。你可以设计一种“并行”向量运算:

function F(x, y) {
    return [x + 2*y, 2*x + 3*y];
}
var x, y;
[x, y] = F(1, 2);

元组作业[x, y] = ...仅适用于支持Javascript 1.7的一些现代浏览器(例如Firefox,但不支持IE8)。另一种可能性是按对象模拟向量:

function G(x, y) {
    return {x: x + 2*y, y: 2*x + 3*y};  // here, the statements can be switched
}
var z = G(1, 2);
// use z.x, z.y ...