2016-08-02 4 views
-1

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

function test1() { 
    for (var i = 1; i <= 1000000; i++) { 
    } 
    console.log("test1"); 
} 

function test2() { 
    console.log("test2"); 
} 

test1(); 
test2(); 
//test1 
//test2 

function test1() { 
     setTimeout(function() { 
     console.log("test1"); 
     }, 1000); 
    } 

function test2() { 
    console.log("test2"); 
} 

test1(); 
test2(); 
//test2 
//test1 
+0

Выполнение цикла синхронизируется, 'setTimeout' является асинхронным, это разница – Thomas

ответ

0

Поскольку цель setTimeout (MDN | spec) является запланировать вызов функции позже, асинхронно. Итак, во втором примере вы сначала вызываете test1, и он планирует вызов анонимного обратного вызова на секунду позже, а затем возвращается. Затем вы вызываете test2, который печатает сразу. Через секунду обратный вызов вызывается таймером и печатает test1.

Возможно, это небольшая настройка вашего второго примера будет сделать его более ясным:

function test1() { 
 
    console.log("test1 called, setting up timer"); 
 
    setTimeout(function() { 
 
    console.log("timer fired and called the callback"); 
 
    }, 1000); 
 
} 
 

 
function test2() { 
 
    console.log("test2 called"); 
 
} 
 

 
test1(); 
 
test2();

Вы видите этот вывод (последняя строка появляется только после того, как второй):

 
test1 called, setting up timer 
test2 called 
timer fired and called the callback 
0

setTimeout - это асинхронная операция, число используется для определения задержки, при которой будет выполняться код. 1000 задержка, поэтому вы видите результата иначе

0

http://javascript.info/tutorial/settimeout-setinterval проверить это Mabe это поможет :)

+1

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

0

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

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