1

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

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);
});
4

2 回答 2

3

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

setTimeout(function(){
    test_obj.init(i)
}, i);
于 2013-07-05T05:09:11.903 回答
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);
        }

小提琴

另一种方法是使用function.bind

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

小提琴

于 2013-07-05T05:09:27.567 回答