2010-05-31 3 views
3

В приложении я создаю я опрос для обновления статуса, и я заметил, что если вызов производится следующим за таймаута пожаров непрерывно:В чем разница между передачей функции и вызовом функции в javascript?

setTimeout($.get("http://localhost:8080/status", function(data) { UpdateStatus(data);}), 1000); 

Хотя, если использовать функцию вместо этого таймаута пожары каждые 1000 мсек:

setTimeout(function() {$.get("http://localhost:8080/status", function(data) { UpdateStatus(data);})}, 1000); 

Почему?

+0

возможно дубликат [? Почему мой вызов функции, которая должна быть запланирована SetTimeout выполняется немедленно] (http://stackoverflow.com/questions/2037203/why-is-my-function-call-that-should-be-scheduled-by-settimeout-executed-immediat) – outis

ответ

3

В первом примере вы находитесь , вызывая$.get, а затем передавая его возвращаемое значение в setTimeout. Во втором примере вы вообще не вызываете эту функцию; вы даете setTimeout функцию, которую это, позвоните позже, после чего позвоните по телефону $.get.

Это легче увидеть более простой тестовый пример:

function test() { 
    alert("Hi there!"); 
} 

// WRONG, *calls* `test` immediately, passes its return value to `setTimeout`: 
setTimeout(test(), 1000); 

// Right, passes a reference to `test` to `setTimeout` 
setTimeout(test, 1000); 

Обратите внимание, что первый из них имеет круглые скобки (()), второй не.

Если вы хотите передать параметры функции, вы должны сделать это косвенно, определяя другую функцию:

function test(msg) { 
    alert(msg); 
} 

// WRONG, *calls* `test` immediately, passes its return value to `setTimeout`: 
setTimeout(test("Hi there!"), 1000); 

// Right, passes a reference to a function (that will call `test` when called) to `setTimeout` 
setTimeout(function() { test("Hi there!"); }, 1000); 
+1

Я новичок в Javascript, но должен " вы видели это, спасибо! – mbesso

0

Вы не должны передавать результат вызова функции setTimeout - нет смысла в этом. Первым аргументом должна быть сама функция, а не вызов.

Почему срабатывает постоянно - странный побочный эффект, который знает :)

3

В первом примере первого параметр setTimeout становится назначен результата из $.get (неправильно), тогда как во втором примере он фактически получает параметр функции типа, который будет правильно оцениваться как набор операторов javascript каждые x миллисекунд.

Смежные вопросы