在使用setTimeout()和传递函数引用时,这是一个常见的错误,您希望在其中调用带有参数的函数。这行代码:
setTimeout( async_func(5, function(number) {
立即执行async_func(),然后将其返回结果(不是函数)传递给setTimeout()这不是您想要的。您想传递一个函数引用,setTimeout()以便setTimeout()稍后调用该函数,如下所示:
var async_func = function(x, func) {
    func(x+5);
};
setTimeout( function() {
    async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    });
}, 3000);
console.log("done");    
或者,有时通过将计时器回调函数设为不带参数的独立函数更容易理解。
function async_func(x, func) {
    func(x+5);
}
function timer_func() {
    async_func(5, function(number) {
        for (var x = 0; x < 1000000000; x++) {;}
        console.log(number);
    });
}
setTimeout(timer_func, 3000);
console.log("done");