我写了一个小脚本,很好奇为什么控制台立即记录所有值而不是延迟输出直到超时结束...
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);
});
答案 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 强>