我的setTimeout函数发生了什么?

时间:2015-08-17 18:15:21

标签: javascript settimeout

我正在尝试创建一个函数(下一个),它将一个函数和一个等待时间作为其参数。然后它将有一个计数器,将通过函数调用增加。

var up = function() {
    var counter = 0;  
   return counter += 1;
};

var next = function(fn, wait) {
    var total = 0; //set total variable to 0
    var x = fn(); //call the function and set answer to a variable
    total+=x; //add the answer to the total

    var n = setTimeout(function(){fn();}, wait); 

//THIS BIT DOES NOT GIVE ME 1? Instead I get any number from 16 (depenging on how many times I call it! It increases as I keep calling the function....?!)

    total += n; 
    return total; 
};
next(up,1000);

我完全不知道为什么setTimeout会像这样工作?!

我已经四处寻找答案并且没有幸运 - 如果我之前已经被问过,我很抱歉在这里错过了这个问题! 我确实碰到了this question,并尝试将变量计数器放在外面,但这似乎没有任何区别......

这个question似乎更接近我所困惑的领域但是我对任何理解我的问题都没有任何帮助。我会非常感谢为什么我得到的回报值远远高于我期望他们是什么..

我尝试的另一种方法是:

var next = function(func, wait) {

    var storedAnswer = 0;
    var answer = function() {
        return storedAnswer;
    }
    var increase = func;
    setTimeout(increase, wait); 
    return answer();
};

next(up, 100);  // gives me 0...? the up function here is defined in the above code...

但最终我没有在答案中得到任何动作......

3 个答案:

答案 0 :(得分:1)

setTimeout返回的值是一个int。但它也是全局超时计数器。也就是说每个超时共享同一个计数器。所以你得到16就意味着某个地方,在你网页的某些部分,已经执行了15次其他超时。

在这种情况下,返回一个16或者基本上不是1的整数是完全正常的,例如,使用带有clearTimeout的整数仍将正确引用所使用的超时。

除了

在node.js中(它看起来并不像你正在使用的那样),机制是相同的,除了返回一个timeoutObject,它仍然可以用来清除超时。它还用于continuation和其他服务器端相关的计时机制。

答案 1 :(得分:1)

setTimeout返回超时ID,而不是回调的返回值。

  

var timeoutID = window.setTimeout(code,[delay]);

试试这个:

setTimeout(function(){total += fn();}, wait);

答案 2 :(得分:0)

nsetTimeout的返回值,它是一个数字标识符,您可以将其传递给clearTimeout以取消超时。

这里的基本问题是setTimeout只是在给定的延迟之后注册要调用的函数,然后执行立即继续到下一行。所以这一行:

total += n;

等待超时完成。它会立即发生,n就像我说的那样,不是你想要的价值。

您需要next函数来接收超时完成后可以调用的回调。

var next = function(fn, wait, callback) {
    var total = 0;
    var x = fn();
    total+=x;

    setTimeout(function() {
        var n = fn();
        total += n;
        callback(total);
    }, wait); 
};

您可以这样称呼:

next(up, 100, function(total) {
    // This function runs after the operation is done; do something with the total.
});