2012-06-07 4 views
-2

Я не понимаю, почему второй вызов функции (после тела функции) имеет приоритет над внутренней частью тела?Приоритет выполнения функции в javascript

function a(){ 
    var num = 5; 
    console.log(++num); 
    setTimeout(a, 100); 
}; 
setTimeout(a,2000) 
+1

Какое поведение вы ожидаете? – Sirko

+0

Вы должны были написать «function a() {...}();" (обратите внимание на заключительные круглые скобки)? Ваш код не вызывает функцию перед последней строкой. – tsiki

+0

Я просто хочу знать, почему один звонок ждет другого? Тогда я смогу предсказать поведение. – carousel

ответ

4

В хронологическом порядке:

  • вы определяете функцию aбез назвав его

  • вы планирования a, который будет вызван после двух секунд: setTimeout(a,2000)

  • это называется

  • , когда она называется, она планирует сама для вызова через 100 миллисекунд

Ваш код в основном спит в течение 2 секунд, а затем выполняет a 100 мс пауза [*].

Однако, судя по вашим условиям вы спрашиваете, что является приоритет в следующей ситуации:

setTimeout(a, 2000); 
setTimeout(b, 100); 

Ну, скорее всего b будет называться первым (при условии, что нет непредсказуемый паузы между первой и второй линией, например, из-за общей проблемы производительности ОС).

Если вы используете одни и те же таймауты:

setTimeout(a, 100); 
setTimeout(b, 100); 

a будет, скорее всего, называется первым. Однако я не думаю, что это гарантировано и зависит от механизма JS (независимо от того, использует ли он строгий список FIFO для предстоящих событий, что такое внутреннее разрешение часов и т. Д.)

[*] Вы можете получить похожее с использованием setInterval()раз.

+0

Я отправился в +1, но, пожалуйста, опустите часть 'setInterval' ... Здесь очень мало работы и может быть запутанным для карусели. – MaxArt

+0

@MaxArt: перемещен в меньшую заметку. Я не думаю, что это сбивает с толку, но согласитесь, что это не очень связано со сценарием –

1

Функция a не называется, просто определена. Кусок кода, который фактически выполняется, - это определение a, затем вызывается setTimeout(a,2000).

0

Я думаю

function a() { 
    var num = 5; 
    console.log(++num); 
    setTimeout(a, 100); 
}; 

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