var wait = function() {
return setTimeout(function() {
return 8;
}, 1000);
}
var foo = function() {
if (wait() === 8) {
return 99;
} else {
return 23;
}
}
console.log(foo());
打印23
我理解函数调用是异步的;但是,在wait()
函数返回之前,如何评估if块?我试图实现的逻辑如何在javascript中成功表示?
答案 0 :(得分:5)
我理解函数调用是异步的;
函数调用完全同步。
在wait()函数返回之前,如何评估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);
})
答案 1 :(得分:4)
“我理解函数调用是异步的”
不,函数调用是同步的。
当您致电foo()
时,它(显然)执行此行:
if (wait() === 8) {
...调用wait()
。 wait()
函数立即返回setTimeout()
返回的值,这是一个可以与clearTimeout()
一起使用的超时ID。此超时ID可能不是8
,因此else
案例已完成。
setTimeout()
不关心传递给它的函数的返回值,因此return 8
“消失” - 没有用该值完成。
传递给setTimeout()
的函数排队等待稍后执行:这将在指定的延迟(1000ms)之后或当前函数(以及任何调用它)完成后执行,以较晚者为准。
答案 2 :(得分:0)
如果您阅读Timeout explains
从这里开始,尝试timeout test,您将知道wait
只是超时对象的id。您甚至可以在1秒内调用clearTimeout(wait)
来清除超时对象。
答案 3 :(得分:0)
通常,setTimeout函数将返回一个与clearTimeout方法一起使用的整数。 http://msdn.microsoft.com/en-us/library/ie/ms536753(v=vs.85).aspx
wait()方法返回1,所以如果没有执行块。但是在1000 ms之后执行setTimeout函数。