settimeout没有延迟

时间:2013-07-05 05:06:48

标签: javascript jquery

我写了一个小脚本,很好奇为什么控制台立即记录所有值而不是延迟输出直到超时结束...

JS:

var test_obj = {
    init: function(i) {
        if (i < 10000) {
            console.log(i + "<br />");
            i = i+i;
            setTimeout(test_obj.init(i), i);
        }
    }
};

$(document).ready(function() {
    var i = 1;
    test_obj.init(i);
});

2 个答案:

答案 0 :(得分:3)

因为你正在调用这个函数。您应该将函数指针传递给setTimeout而不执行该函数。

setTimeout(function(){
    test_obj.init(i)
}, i);

答案 1 :(得分:2)

这是因为,您没有将函数引用传递给超时。而是通过使用parens ()调用它来立即调用它。 setTimeout(test_obj.init(i), i);现在,这将调用函数并将函数的返回值设置为引用,此处未定义,因为您不返回任何内容。

而是尝试这种方式:

 init: function(i) {
        if (i < 10000) {
            console.log(i + "<br />");
            i = i+i;
            setTimeout(function(){ // Do this way
                 test_obj.init(i); 
             }, i);
        }

<强> Fiddle

另一种方法是使用 function.bind

  setTimeout(test_obj.init.bind(this, i), i);

<强> Fiddle