В следующем коде:

function doStuffA() {
 // DO SOME THINGS

 doStuffB();

 // DO SOME MORE THINGS
}
function doStuffB() {
// DO B THINGS
}
doStuffA();

В каком порядке выполняется код?

Это:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

Или же:

1. DO SOME THINGS
2. DO B THINGS & DO SOME MORE THINGS - AT THE SAME TIME
1
Amanda Kitson 25 Янв 2013 в 01:00

3 ответа

Лучший ответ

Предполагая, что вы намеревались сделать doStuffB в doStuffA звонке и где-то в doStuffA вызове ...

Javascript традиционно выполняется синхронно.

Следовательно:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS
5
Lightness Races in Orbit 24 Янв 2013 в 21:03

Хорошо, если вы хотите позвонить doStuffA() ...

    function doStuffA() {
     // DO SOME THINGS

     doStuffB();

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }

Вышеуказанное приведет к

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

Если вы хотите асинхронный подход, вы должны использовать setTimeout(). Вот несколько документов: https://developer.mozilla.org/en- США / документы / DOM / window.setTimeout

Т.е.

    function doStuffA() {
     // DO SOME THINGS

       setTimeout(doStuffB,1);

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }
-1
JonH 24 Янв 2013 в 21:27

Было много дискуссий о вашем синтаксисе, но я думаю, что смогу заполнить пробелы достаточно хорошо, чтобы понять, о чем вы спрашиваете. Вы хотите знать, выполняется ли JavaScript последовательно; в частности, если вызов функции приостановит выполнение вызывающей функции, пока вызываемая функция не завершится.

Общий случай…

В общем случае ответ - да. Вот пример кода, чтобы проиллюстрировать это:

var count = 0;
var result = "";

function a() {
    result += "first part of A. \n";    
    b();    
    result += "last part of A. ";
}

function b() {
    for (var i = 0; i < 100000; i++) {
        count++;
    }
    result += "even after " + count + " cycles, A waits for B. \n";
}

a();
console.log(result);

Выполняемая версия в jsFiddle: http://jsfiddle.net/jmorgan123/574Rh/

Попробуйте это. Вы увидите, что результат:

first part of A. 
even after 100000 cycles, A waits for B. 
last part of A.

Исключения из правила

Есть исключения из этого, и они очень важны. Когда вы устанавливаете интервал или тайм-аут, программа запускает таймер и планирует запустить функцию по окончании таймера. Но это не ждет, пока это произойдет; после запуска таймера остальная часть программы выполняет другие задачи:

//won't do what you want:
result += "first part of A ";  
setInterval(b, 1000);
result += "last part of A ";

В этом случае, когда a() завершит работу, result будет:

first part of A, last part of A 

Фактически, это все, что вы увидите, потому что console.log(result) будет запущен раньше, чем b().

Другой важный случай, когда JS откладывает выполнение, - это вызовы AJAX; это все время сбивает людей с толку. Вот пример этой ошибки:

//also won't do what you want:
result += "first part of A ";
$.get('ajax/test.html', function(data) {
    result += "now with AJAX! "; 
});
result += "last part of A ";

Опять же, результат будет first part of A, last part of A при выполнении console.log(result). Единственный способ гарантировать, что ваш код запускается после вызова AJAX, - поместить его в обратный вызов:

var result = "";

function a() {
    result += "first part of A ";
    $.get('ajax/test.html', function(data) {
        result += "now with AJAX! "; 
        result += "last part of A ";
        console.log(result);
    });
}

a();

alert() и confirm()

Последнее замечание: Интересно, что функции alert() и confirm() do фактически прерывают поток управления. Если ваш код выглядит так:

result += "first part of A, ";  
result += confirm("what is your choice?"); //let's assume you click 'OK' here
result += ", last part of A";

... результат будет first part of A, true, last part of A независимо от того, сколько времени вы ждете, чтобы нажать OK. confirm и alert - единственные случаи (поправьте меня, если я ошибаюсь), когда JavaScript приостанавливает выполнение, ожидая некоторого внешнего источника.

2
Justin Morgan 25 Янв 2013 в 15:45