这是如何评估语句
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函数被执行。