我有两个一个接一个调用的函数,x和y是全局变量。
function setVariables() {
x = 2;
y = 10;
};
function useVariables() {
console.log(x);
console.log(y);
};
假设我一个接一个地在文档就绪函数中调用这两个函数。在setVariables
被调用之前useVariables
是否保证“完成”?或者,假设setVariables
可能很长并且需要一些时间来运行,那么在useVariables
有机会设置之前setVariables
尝试使用这些全局变量的情况下,您是否会遇到这种情况?它们?
答案 0 :(得分:3)
JavaScript是单线程的。它不可能让代码并行运行。这两个函数将始终按顺序执行。
区分并行和异步非常重要。
并行性是代码在不同线程或不同进程中同时运行的可能性。当你有并行性时,你必须开始担心竞争条件和共享状态的同步。
作为一种单线程语言,并行性不会在JavaScript中发挥作用。†
异步是指在不可预测的时间以不可预测的顺序运行代码的能力。如果您使用setTimeout
或设置AJAX回调或注册事件处理程序,则无法保证订购。例如,当您注册多个超时回调时,您不应该假设它们以一个特定的顺序执行。
Asynchrony并不一定意味着代码将并行执行。在其他语言中它可能,但在JavaScript中它不会。您不必担心在一个事件处理程序中使用的变量被其他事件处理程序更改。当您的代码正在运行时,它是仅代码正在运行。
† Web workers使答案复杂化。 Web worker通过允许在后台线程中完成工作来提供并行性。但是,这些线程只能通过异步事件与主线程接口。没有共享数据。主线程没有看到这些后台线程。它仍然可以安全地假装世界是单线程的。
答案 1 :(得分:2)
setVariables()
useVariables()
setVariables()将始终执行并在下一行(useVariables())执行之前完成。