2013-07-05 3 views
1

я написал небольшой скрипт, и мне любопытно, почему консоль регистрирует все значения сразу против задержки выходного сигнала до тех пор, таймауты не удовлетворены ...Никакой задержки с SetTimeout

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); 
}); 
+1

Поскольку 'test_obj.init (я)' 'возвращает undefined', поэтому то, что' SetTimeout (test_obj.init (я), я), 'на самом деле, является' SetTimeout (false, i); '. Обратите внимание, что 'test_obj.init' выполняется до' setTimeout', и вы должны передать ссылку на функцию вместо результата функции. Это обычная ошибка, которую обычно делают начинающие JS. :) –

+0

Вы можете использовать привязку ecmascript, если вы не хотите использовать анонимную ссылку на функцию. – PSL

+0

Означает ли это, что всякий раз, когда я использую скобки, сценарий всегда будет выполняться немедленно? –

ответ

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

+0

Все хорошие ответы, но вы дали больше информации! Благодаря! –

+0

@tomc Добро пожаловать. – PSL

3

Потому что вы вызываете функцию. Вы должны передать указатель на setTimeout и не выполнять функцию.

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