2013-05-31 3 views
0

Я вхожу в путаницу здесь. Перейди через код ниже,Вызов функции SetInterval

<script> 

setInterval(function1,3000); 

setInterval(function2(),3000); 

function function1() { 
    console.log("Function1 called...."); 
} 

function function2() { 
    console.log("Function2 called...."); 
} 

</script> 

Как вы можете видеть, у меня есть две функции setInterval одна вызывает функцию как function1 и другой function2(). Результат первого является идеальным, который вызывается каждые 3 секунды и первый вызов после 3 секунд. Но второй вызов вызывается без задержки i.e function2.

Я думаю, что () может там что-то делать, но я не уверен в том, чего я там не вижу. Я просто хочу знать, что там происходит.

ответ

1

Во втором setInterval вы выполняете его сразу и подключаете значение, возвращаемое этой функцией, в setInterval.

Например,

setInterval(a(), 5000); 
function a(){ 
    return function(){ 
     console.log("Executed!"); 
    }; 
}; 

a() выполняется и возвращение function в setInterval. Вы должны увидеть, что консоль записывает Executed каждые 5 секунд.

Это так же, как математика:

f(x) = x + 1 
g(x) = 2 

f(g(2)) = g(x) + 2 = 4 
You replace g(2) with whatever it returns 
(you replace a() with the function in this case) 

http://jsfiddle.net/DerekL/39wNn/

+1

Большое спасибо Дерек. – Vinay

1

The() делает функцию получить немедленно казнены во втором случае. В первом случае просто указатель на функцию, которая будет выполняться позже как функция обратного вызова.

4

setInterval(function1,3000); инструктирует двигатель JS выполнять функцию function1 каждые 3 секунды.

setInterval(function2(),3000); поручает двигателю JS запустить function2один раз, а затем запустить возвращаемое значение каждые 3 секунды. Это возвращаемое значение пусто.

Для немного удовольствия попробуйте

function function2() { 
    console.log("Function2 called...."); 
    return "function3();" 
} 

function function3() { 
    console.log("Function3 called...."); 
} 

setInterval(function2(),3000); 

Редактировать

В réponse к @ Харшам замечанию: Что я имею в виду «запустить возвращаемое значение»

setInterval(function2(),3000); будет вызывать следующий рабочий процесс:

  • Инициировать исполнителю ing function2() (выполнить его, потому что он указан в скобках).
  • function2 заканчивается, а затем возвращается.
    • В вашем OQ, нет возвращаемого значения из функции так null
    • Значение возврата моего function2 является строка "function3();"
  • Это возвращаемое значение теперь вставляется в setInterval() вызова
    • В OQ версия результаты в setInterval(null, 3000);, который ничего не делает каждые 3 секунды
    • Моя версия Результаты в setInterval("function3();", 3000), который вызывает eval("function3();"); каждые 3 секунды, что в свою очередь запускает function3 каждые 3 секунды.
+1

+1 для аккуратного объяснения. –

+0

Что именно означает «запустить возвращаемое значение»? Я хотел бы понять. –

+0

@harsha - В принципе 'eval ([возвращаемое значение]);' –

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