异步如何处理 Javascript 中的变量

How does asynchrony deal with variables in Javascript?

本文关键字:Javascript 变量 处理 何处理 异步      更新时间:2023-09-26

假设我有以下代码

var x = 5;
for (var i = 0; i < 1000; i++) {
     x = x + i;
}
launch(x);

function launch(x) {
     console.log(x);
}

javascript 的异步性质是否意味着函数launch可以在for周期结束之前被调用?还是仅在x上的操作结束后才调用?如何确保后者?

更新:我在Node.js应用程序中使用它

No.仅当for周期异步运行时,这才是正确的。

函数launch将始终在循环退出后引起。区别可能是如果你有类似的东西

for (var i = 0; i < 1000; i++) {
     somethingAsync(i);
}
launch(x);

循环仍将首先完成,但somethingAsync(i)可能不会完成,因为它是异步运行的。循环始终同步运行,只有循环的内容可以异步运行。你必须知道你调用的函数是同步的还是异步的。

如果循环体是异步的,则必须做更多的工作来运行函数,launch(x)循环中的所有内容都返回后。这个概念叫做promises,它基本上允许你说这样的话,比如这里有一个异步操作列表,在所有这些操作完成后运行其他东西

以下是一些关于承诺的参考资料

  • http://www.html5rocks.com/en/tutorials/es6/promises/
  • https://developer.mozilla.org/cs/docs/Web/JavaScript/Reference/Global_Objects/Promise
  • https://www.promisejs.org/

更新:上述内容适用于 Node.js 和浏览器。JavaScript 作为语言的语义在这两种情况下是相同的。

JavaScript 是完全同步和确定性的,直到你实际调用异步构造(如setTimeout或异步 HTTP 请求(。该代码将按顺序执行。

这段代码将同步运行,因为没有异步调用(如 $.get、$.ajax 和来自 jquery 的一些东西(