这是如何评估语句

var wait = function() { return setTimeout(function() { return 8; }, 1000); } var foo = function() { if (wait() === 8) { return 99; } else { return 23; } } console.log(foo()); 

打印23

我明白函数调用是asynchronous的; 然而,如何才能评估if块,直到wait()函数返回? 我试图实现的逻辑如何成功地在JavaScript中表示?

我明白函数调用是asynchronous的;

函数调用是完全同步的。

甚至如何评估if块,直到wait()函数返回?

你的等待函数立即返回setTimeout的结果,即Timeout ID。 您传递给setTimeout的函数将在将来某个时间执行,并且返回值将丢失。

我试图实现的逻辑如何成功地表示在JavaScript中?

你可能正在寻找的代码是这样的。 我已经手动将您的代码转换为Continuation Passing Style

 // `wait` takes a callback which is captured in it's closure to be used by // the anonymous function passed to setTimeout, sometime in the future. var wait = function(callback) { return setTimeout(function() { callback( 8 ); }, 1000); } // `foo` also takes a callback that will be called when the function passed // to `wait` is evaluated. var foo = function(callback) { wait(function(value){ if (value === 8) { callback( 99 ); } else { callback( 23 ); } } } // Finally, `foo` is called with another callback, this time logging the value. foo(function(value) { console.log(value); }) 

“我明白函数调用是asynchronous的”

不,函数调用是同步的。

当你调用foo() ,它显然会执行这一行:

 if (wait() === 8) { 

…其中调用wait()wait()函数立即返回由setTimeout()返回的值,这是一个可用于clearTimeout()的超时ID。 这个超时ID不可能是8 ,那么else情况就完成了。

setTimeout()不关心你传递给它的函数的返回值,所以return 8 “消失” – 没有任何值与该值相关。

你传递给setTimeout()的函数被排队等待执行,这将在指定的延迟(1000ms)之后或者在当前函数(以及任何调用它)完成执行之后发生,以后者为准。

如果你阅读超时解释

从这里开始,并尝试超时testing,您将知道wait只是超时对象的ID。 你还可以在1秒内通过调用clearTimeout(wait)来清除超时对象。

通常情况下,setTimeout函数将返回一个与clearTimeout方法一起使用的整数。 http://msdn.microsoft.com/en-us/library/ie/ms536753(v=vs.85).aspx

wait()方法返回1,所以如果块没有被执行。 但是在1000 ms之后,setTimeout函数被执行。