Javascript 我的setTimeout函数发生了什么变化?

Javascript 我的setTimeout函数发生了什么变化?,javascript,settimeout,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

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

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会这样工作

我环顾四周寻找答案,但没有找到幸运的答案-如果我错过了这里的问题,我很抱歉,如果以前有人问过的话! 我确实遇到并尝试将变量计数器放在外面,但是这似乎没有任何区别

这似乎更接近于我所困惑的领域,但是我还没有更接近于理解我的问题。我非常感谢任何帮助,因为我得到的回报值比我预期的要高很多

我尝试的另一种方法是:

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...

但结果是我的答案没有任何变化…

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

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

旁白

在node.js中(看起来与您使用的不同),机制是相同的,只是返回了一个timeoutObject,它仍然可以用来清除超时。它还用于继续和其他服务器端相关的计时机制。

返回超时id,而不是回调的返回值

var timeoutID=window.setTimeout(代码,[delay])

试试这个:

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

n
setTimeout
的返回值,这是一个数字标识符,您可以传递到
cleartimout
以取消超时

这里的基本问题是
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.
});

我对你的问题陈述有点困惑——你能澄清一下“函数调用将增加的计数器”是什么意思吗?我很确定您出现问题的原因是对异步处理的误解,但我不确定您实际上在尝试做什么,因此我无法帮助您。
setTimeout
返回一个句柄,您可以使用该句柄来
cleartimout
。把这些值加在一起是没有意义的,因为它们甚至可能不是数字。我认为它并不总是一个数字。我的意思是这取决于环境。例如,在nodejs中,它可能是一个对象。@apendua-我做了一个小编辑来反映这一点,但这个问题的范围并不是真正针对node的。在客户端web(我认为这是范围)中,环境倾向于引用浏览器,所有浏览器都会表现出与此答案中所述相同的行为。谢谢!我明白你的意思。我之所以注意到这一点,是因为语言标准没有说明任何关于
setTimeout
的返回值的内容,因此在形式上不能假设它是一个数字。我说的对吗?@apendua-再一次,scope。基于客户端,万维网联盟(W3C)明确声明setTimeout的返回类型为
long
。这就是为什么node.js是一个不同的故事,它不是客户端,而是服务器端,因此具有更多的控制权,并使用稍大的抽象层。语言本身不描述
setTimeout