2014-09-06 77 views
0

我有两个函数调用一个接一个,x和y是全局变量。函数,时序,调用顺序和全局变量

function setVariables() { 
    x = 2; 
    y = 10; 
}; 

function useVariables() { 
    console.log(x); 
    console.log(y); 
}; 

说我把这两个函数一个接一个地调用文档就绪函数。保证在useVariables被调用之前“完成”setVariables?或者,考虑到setVariables可能会很长并且需要一些时间来运行,您是否最终会在useVariables尝试使用这些全局变量,然后setVariables有机会设置它们?

+2

您能否更具体地了解您的真实问题,而不是您想要解决的问题? – raina77ow 2014-09-06 16:51:39

回答

3

JavaScript是单线程的。代码并行运行是不可能的。这两个函数将始终按顺序执行。

区分并行性异步很重要。

  • 并行是在不同的线程或不同的过程同时运行的代码的可能性。当你有并行性时,你必须开始担心竞争状态和共享状态的同步。

    作为一种单线程语言,并行性在JavaScript中不起作用。

  • 非同步是有代码运行在不可预测的时间不可预测的顺序的能力。如果您使用setTimeout或设置AJAX回调或注册事件处理程序,则您无法保证订购。例如,当您注册多个超时回调时,您不应该认为它们以特定顺序执行。

    异步并不一定意味着代码将并行执行。在其他语言中,它可能会使用JavaScript,但它不会。您不必担心在一个事件处理程序被其他事件处理程序更改时使用的变量。在您的代码正在运行时,它只能运行代码。


Web workers复杂的答案。 Web工作者通过允许在后台线程中完成工作来提供并行性。不过,这些线程只能通过异步事件与主线程连接。没有共享数据。主线程不会看到这些后台线程。它仍然可以安全地假装世界是单线程的。

+2

所以你可以保证在这里订购? 'window.setTimeout(foo,0); window.setTimeout(bar,0);' – 2014-09-06 16:52:45

+2

这不是被问及的问题。问题是在文档就绪函数中函数被一个接一个地调用。 – 2014-09-06 16:54:14

+0

'+ 1'因为答案现在解释异步的方式,让OP知道你不能**总是**承担函数调用顺序,但对于大多数代码毫无疑问。 – 2014-09-06 17:10:49

2
setVariables() 
useVariables() 

setVariables()应该并且将在下一行(useVariables())执行之前始终执行并完成。

+1

超时和间隔也不会保证顺序,基本上什么都不“异步” – 2014-09-06 16:51:35

+0

当然。我忘了提及:) – 2014-09-06 16:52:28

+0

@ raina77ow我们没有看到OP如何调用它们的代码;为什么我们应该假设没有? – 2014-09-06 16:54:38