2

我一直在想这个问题,从来没有找到一个令人信服的答案。

请考虑以下情况:

var toAddress = '';
if(j==1)
{
  toAddress="abc@mydomain.com";
}
else
{
  toAddress="xyz@mydomain.com";
}

sendAlertEmail(toAddress);

我可以确定当我的 sendAlertEmail() 函数被调用时,我将填充“toAddress”吗?

4

3 回答 3

3

对于您提供的示例代码:

var toAddress = '';
if(j==1)
{
  toAddress="abc@mydomain.com";
}
else
{
  toAddress="xyz@mydomain.com";
}

sendAlertEmail(toAddress);

您绝对可以确定它是严格顺序的。也就是说 的值toAddress"abc@mydomain.com"or "xyz@mydomain.com"

但是,对于如下代码:

var toAddress = '';
doSomething(function(){
  if(j==1)
  {
    toAddress="abc@mydomain.com";
  }
  else
  {
    toAddress="xyz@mydomain.com";
  }
});

sendAlertEmail(toAddress);

然后就看函数doSomething是否异步了。查找的最佳位置是文档。第二个最好的是查看实施。

如果doSomething不是异步的,那么代码执行基本上是顺序的,您绝对可以确定它toAddress已正确填充。

但是,如果doSomething是异步的,那么您通常可以确定代码执行不是顺序的。因为这是异步函数的基本行为之一——它们立即返回并在稍后执行传递给它们的函数。

并非所有对函数进行操作的函数都是异步的。同步函数的一个例子是forEach数组的方法。但是所有异步函数都接受函数作为参数。这是因为它是在异步操作结束时执行某些代码的唯一方法。因此,每当您看到将函数作为参数的函数时,您都应该检查它是否是异步的。

于 2013-03-16T17:54:12.797 回答
0

Node.js 是单线程的(或者至少是 JS 执行),因此由于上述所有代码都是同步的并且排成一列,所有代码都发生在同一个时钟周期内,因此它将按顺序运行,因此必须填充 toAddress。

一旦引入异步函数,事情就会变得复杂。在异步情况下,变量可以在行之间移动,因为它们之间会出现刻度。

为了在每个滴答期间澄清代码,只需从执行的顶部到底部评估代码​​。在第一个滴答期间,执行范围是整个文件,但之后是回调和处理程序。

于 2013-03-16T17:31:01.753 回答
0

您编写的代码非常简单地指出了异步行为。看看这段代码:

var toAddress = 'abc@mydomain.com';
if(j==1)
{ func1(toAddress); }
else
{ func2(toAddress); }
sendAlertEmail(toAddress);

不能保证 sendAlertEmail 将仅在 func1 或 func2(if else 条件)执行后执行。在节点中,函数在被调用时立即返回并执行下一个调用的函数。如果您想确保它们按顺序执行,请使用回调或使用async 之类的库。

于 2013-03-16T18:00:05.737 回答