Являются ли функции JavaScript асинхронными? - программирование
Подтвердить что ты не робот

Являются ли функции JavaScript асинхронными?

Рассмотрим следующую выполняемую функцию:

function loadPage()
{
    takeInput();
    processInput();
    outputInput();
}

В каком порядке они будут выполнены (у меня read, что он следует за стеком, поэтому вариант 2 будет ответом)?

Вариант № 1

  • takeInput();
  • ProcessInput();
  • outputInput();

Вариант № 2

  • outputInput();
  • ProcessInput();
  • takeInput();
4b9b3361

Ответ 1

Функции JavaScript не асинхронны. Некоторые очень ограниченный набор функций имеют асинхронный API:

addEventListener, setTimeout, setInterval. Это единственные 3 (которые, как я думал, были очень удивлены).

Они позволяют вам передать обратный вызов, который может быть вызван в конце концов. Например, когда истекает таймер или когда пользователь нажимает на что-либо или когда завершается запрос AJAX.

JavaScript имеет цикл событий. Цикл событий обрабатывает каждое событие по мере его поступления. Если вы нажмете кнопку 3 раза, а затем истечет таймер, это также будет порядок, в котором будут обрабатываться события. Все это очень четко определено и определено.

Кроме того, JavaScript не имеет потоков, он запускает одно событие полностью, пока вам нечего делать (вы возвращаетесь), прежде чем начинать следующее событие. Таким образом, события никогда не будут вмешиваться. Это позволяет сделать очень сильные предположения о состоянии ваших данных.

Ответ 2

Являются ли функции JavaScript асинхронными?

Некоторые из них, большинство из них не являются.

В каком порядке они будут выполнены

Они будут выполняться в том порядке, в котором они вызываются. Поскольку все они вызваны из одной и той же функции, это будет в простом линейном порядке.

Если какой-либо из них написан асинхронным образом, они могут не завершить всю свою деятельность в том же порядке. Для пример:

function a() {
   console.log('a'); 
}
function b() {
   console.log('b'); 
}
function c() {
   console.log('c'); 
}
function aAsync() {
  setTimeout(a, 500); 
}

function load() {
   aAsync();
   b();
   c();
}
load();

Ответ 3

JavaScript не является, как правило, асинхронным, но имеет асинхронные и управляемые событиями методы.

Ajax-вызовы - это большие асинхронные методы.

Для событий я не уверен, что вам может быть гарантирован порядок выполнения, но я могу ошибаться.

Ответ 4

Javascript не Асинхронный.
Он работает синхронно, то есть он запускает одну строку кода за раз. Когда выполняется javascript-код, сначала создается Глобальный контекст выполнения, и если вы вызываете функцию из глобального контекста выполнения, другой механизм выполнения создается механизмом javascript и помещается в начало выполнения stack (глобальный контекст выполнения уже находится в стеке), и если изнутри этой функции вызывается другая функция, создается другой контекст выполнения, и размер стека увеличивается.

Итак, механизм javascript продолжает работать с этим кодом по одной строке за раз, и в этом процессе, если есть какие-либо события/HTTP-запрос, браузер помещает их в EVENT QUEUE. Итак, дело в том, что механизм javascript не обрабатывает события в очереди до тех пор, пока стек выполнения не будет пустым. И когда движок выполнен с помощью стека выполнения, он периодически смотрит, есть ли какой-либо обработчик событий для текущего события в очереди и аналогичным образом создает контекст выполнения для этого обработчика и запускает код внутри. Таким образом, весь процесс является просто синхронным, а асинхронность обрабатывается другими частями браузера, такими как (движок рендеринга или движок http), в то время как механизм javascript продолжает синхронно запускать код.

Итак, в вашем случае, из контекстной функции вызывается loadpage, ее контекст выполнения был создан и помещен в верхнюю часть стека. Затем он вызывает функцию takeinput, ее exec. контекст создается, а другой контекст функций не будет создан и помещен в стек до тех пор, пока контекст takeinput не выскочит из стека выполнения. Таким образом, правильным порядком будет takeinput, processinput и outputinput.

Я надеюсь, что он ответит на ваш вопрос.

Ответ 5

Нет, не по умолчанию/как стандарт, хотя существуют асинхронные методы. И jQuery использует асинхронное поведение намного больше. Но в каждом случае это субъективно, и нельзя сказать, что "весь JavaScript есть тот или иной".

Методы всегда выполняются в том порядке, в котором они вызываются; асинхронность их означает, что любой может завершиться до другого, даже если он вызван впоследствии.

Ответ 6

Javascript - это однопоточный зверь, поэтому строго говоря задачи не асинхронны, как можно было бы подумать о том, чтобы порождать дочерние потоки для выполнения кода. Механизмы, обеспечивающие это, создают иллюзию асинхронности, но ее все еще однопоточность.