Аккуратные.

Это хороший вопрос. Я хотел бы сказать «да». Я не могу.

, пока либо цикл дайджеста не станет чистым (все выражения

(*: игнорирование вопроса о том, действительно ли браузеры реализуют свои движки JS, используя один поток ОС, или есть ли другие ограниченные потоки выполнения, представленные WebWorkers.)

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

Наиболее распространенный случай — это немедленные события. Браузеры будут запускать их сразу же, когда ваш код что-то заставляет их вызывать:

var l= document.getElementById('log');
var i= document.getElementById('inp');
i.onblur= function() {
    l.value = 'blurn';
};
setTimeout(function() {
    l.value = 'log inn';
    l.focus();
    l.value = 'log outn';
}, 100);
i.focus();
<textarea id="log" rows="20" cols="40"></textarea>
<input id="inp">

В идеале, jQuery будет компилировать свои запросы в строки, которые могут быть вставлены, чтобы сделать то, что вы хотели, чтобы jQuery делал, но без диспетчеризации jQuery во время выполнения. Таким образом, у вас есть возможность либо log in, blur, log out на всех, кроме IE. Эти события не просто запускаются, потому что вы вызвали focus() Аналогично, выражения функций оцениваются как значения. И одно из следствий (я полагаю?) Заключается в том, что они могут быть немедленно вызваны: alert(), или открытое всплывающее окно, или что-нибудь еще, что перемещает фокус.

(**) Переменные с областью видимости блока не поднимаются i.onchange, я буду использовать приведенный ниже пример в качестве демонстрации. focus(). Один простой способ сделать это сlog in, change, blur, log out, а css: log in, blur, log out, change (Вы можете инкапсулировать его в функцию или даже добавить его в прототип String, если вы часто его используете.) log in, change, log out, blur Глядя на вывод

Аналогичным образом вызывая click() на элементе, который обеспечивает его, вызывает onclick обработчик сразу во всех браузерах (по крайней мере, это соответствует!).

(я использую прямой { *} javascript — setTimeout или setInterval? — Свойства обработчика событий переполнения стека on....) addEventListener и attachEvent Существует также множество обстоятельств, при которых события могут возникать, пока ваш код находится в потоке, несмотря на то, что вы сделали

Насколько я могу судить, эти два фрагмента javascript ведут себя одинаково: Ничего , чтобы спровоцировать его. Пример:

var l= document.getElementById('log');
document.getElementById('act').onclick= function() {
    l.value = 'alert inn';
    alert('alert!');
    l.value = 'alert outn';
};
window.onresize= function() {
    l.value = 'resizen';
};
<textarea id="log" rows="20" cols="40"></textarea>
<button id="act">alert</button>

. alert, и вы получите модальное диалоговое окно. Больше сценарий не выполняется, пока вы не закроете этот диалог, да? Нету. Измените размер главного окна, и вы получите alert in, resize, alert out Вы можете подумать, что невозможно изменить размер окна, пока модальное диалоговое окно открыто, но это не так: в Linux вы можете изменить размер окна так, как вам нравится ; в Windows, это не так просто, но Вы можете сделать это, изменив разрешение экрана с большего на меньшее, если окно не помещается, что приводит к изменению его размера.

setTimeout

setInterval resize) могут срабатывать, когда пользователь не имеет активного взаимодействия с браузером, потому что скрипт нарезанный И для одиночных окон вы можете быть правы. Но это все подходит к концу, как только вы выполняете межоконный сценарий. Для всех браузеров, кроме Safari, который блокирует все окна / вкладки / фреймы, когда какой-либо из них занят, вы можете взаимодействовать с документом из кода другого документа, работая в отдельном потоке выполнения и вызывая любые связанные обработчики событий для Пожар. scroll Они, по сути, пытаются сделать то же самое, но подход

мест, где могут быть сгенерированы события, которые вы можете вызвать, пока скрипт все еще находится в потоке:

  • , когда модальные всплывающие окна (alert, confirm, prompt в течение

  • добавления дней в JavaScript. Дата showModalDialog # xD ; & # xA ; Как я могу получить результат значений и посчитать из этого?

  • используя JavaScript. Имеет ли JavaScript для меня встроенную функцию, подобную .Net

  • саморегулирующийся таймер

  • выражение)

Таким образом, для большинства пользователей JavaScript, как правило, имеет строгий управляемый событиями единственный поток выполнения. На самом деле такого не бывает. Непонятно, насколько это просто ошибка, а какой умышленный дизайн, но если вы пишете сложные приложения, особенно с кросс-оконными / фрейм-скриптовыми сценариями, есть все шансы, что они могут вас укусить — и периодически, трудные для отладки способы.

Если худшее доходит до худшего, вы можете решить проблемы параллелизма, косвенно реагируя на все события. событие приходит, помещает его в очередь и обрабатывает очередь по порядку позже, в setInterval (который по сути является таймером на основе тайм-аута, который постоянно настраивается в соответствии с задержкой, которую он создал) postMessage также, мы надеемся, поможет в будущем избавиться от проблем, связанных с написанием документов.

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

Добавьте к этому тот факт, что для объяснения (явный, стандартизированный API для многопоточного кода JavaScript), вводящий многопоточность в базовый Javascript, будет в основном бессмысленным.

Обратите внимание, что для тех, кто использует новый Примечание для других комментаторов: Даже если setTimeout/setInterval, События загрузки по HTTP-запросу (XHR) и события пользовательского интерфейса (щелчок, фокус и т. Д.) Создают грубое впечатление многопоточности — они все еще выполняются на одной временной шкале — по одному за раз — поэтому даже если мы не Если заранее знать порядок их выполнения, нет необходимости беспокоиться об изменении внешних условий во время выполнения обработчика событий, функции времени или обратного вызова XHR.)

Да, хотя при использовании любого из асинхронных API-интерфейсов, таких как setInterval и xmlhttp callbacks, вы все равно можете столкнуться с некоторыми проблемами параллельного программирования (в основном, состояния гонки).

Да, хотя Internet Explorer 9 скомпилирует ваш Javascript в отдельном потоке для подготовки к выполнению в основном потоке. Это ничего не меняет для вас, как для программиста.

JavaScript / ECMAScript предназначен для использования в среде хоста. То есть JavaScript на самом деле ничего не делает , если среда хоста не решит проанализировать и выполнить данный скрипт, и предоставлять объекты среды, которые позволяют JavaScript на самом деле быть полезным (например, DOM в браузерах).

Я думаю, что данная функция или блок скрипта будут выполняться построчно, и это гарантировано для JavaScript. Однако, возможно, среда хоста может выполнять несколько сценариев одновременно. Или среда хоста всегда может предоставить объект, который обеспечивает многопоточность. setTimeout и setInterval являются примерами или, по крайней мере, псевдо-примерами среды хоста, обеспечивающей способ выполнения некоторого параллелизма (даже если это не совсем параллелизм).

На самом деле родительское окно может взаимодействовать с дочерние или родственные окна или фреймы, которые имеют свои собственные потоки выполнения.

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

Также в красивом стиле, который мы любим до сих пор. На самом деле я ненавижу вложенный обратный вызов. Легко понять, что сопрограмма2 будет ждать завершения сопрограммы1. Интересно? Хорошо, затем запустите следующие коды:

Nodejs следовал подходу браузеров.

Rhino , однако, код ошибки поддерживает запуск кода js в разных потоках Попробуйте этот пример {* } Я написал некоторый код для реализации функциональности обрезки.

… «Rhino гарантирует, что доступ к свойствам объектов JavaScript является атомарным в разных потоках, но не дает никаких гарантий для сценариев, выполняющихся в одной и той же области одновременно. Если два сценария используют одну и ту же область одновременно, функция Вот и все. Полный пример

Из чтения документации Rhino я заключаю, что кто-то может написать javascript api, который также порождает новые потоки javascript, но api будет специфичным для rhino (например, node может порождать только новый процесс) ).

Я полагаю, что даже для механизма, поддерживающего несколько потоков в javascript, должна быть совместимость со сценариями, которые не учитывают многопоточность или блокировка.

Что касается браузеров и nodejs, то, как я это вижу:

  • Весь код js выполняется в одном потоке? : Да.

  • Кроме того, соглашение об именах для атрибутов данных имеет некоторую скрытую «погрешность»:

  • Могут ли эти потоки изменить контекст выполнения js ?: Нет. Но они могут (прямо / косвенно (?)) Добавить к очередь событий.

, поэтому в случае браузеров и nodejs (и наверное много других движков) javascript не многопоточный но сами движки есть.

No.

Я иду против толпы здесь, но терпите меня. Один JS-скрипт предназначен для его использования эффективно однопоточный, но это не значит, что его нельзя интерпретировать по-другому.

, который я создал для использования в моей библиотеке.

var list = [];
for (var i = 0; i < 10000; i  ) {
  list[i] = i * i;
}

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

Первый поток

for (var i = 0; i < 5000; i  ) {
  list[i] = i * i;
}

Второй поток

for (var i = 5000; i < 10000; i  ) {
  list[i] = i * i;
}

FAQ по Firebug

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

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

// like "use strict" this enables certain features on compatible VMs.
"use parallel";

var list = [];

// This string, which has no effect on incompatible VMs, enables threading on
// this loop.
"parallel for";
for (var i = 0; i < 10000; i  ) {
  list[i] = i * i;
}

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

@ Бобинс дает действительно непрозрачный ответ.

Отстраняясь от ответа Мара Орлигссона, Javascript всегда является однопоточным из-за этого простого факта: все в Javascript выполняется по одной временной шкале.

Это строгое определение однопоточного языка программирования.

Что ж, Chrome является многопроцессорным, и я думаю, что каждый процесс имеет дело со своим собственным кодом Javascript, но, насколько ему известно, он «однопоточный». { *} Работает в междоменных iframes

В Javascript отсутствует поддержка многопоточности, по крайней мере, явно, так что это не имеет значения.

Я попробовал пример @ bobince с небольшими изменениями:

<html>
<head>
    <title>Test</title>
</head>
<body>
    <textarea id="log" rows="20" cols="40"></textarea>
    <br />
    <button id="act">Run</button>
    <script type="text/javascript">
        let l= document.getElementById('log');
        let b = document.getElementById('act');
        let s = 0;

        b.addEventListener('click', function() {
            l.value  = 'click beginn';

            s = 10;
            let s2 = s;

            alert('alert!');

            s = s   s2;

            l.value  = 'click endn';
            l.value  = `result = ${s}, should be ${s2   s2}n`;
            l.value  = '----------n';
        });

        window.addEventListener('resize', function() {
            if (s === 10) {
                s = 5;
            }

            l.value = 'resizen';
        });
    </script>
</body>
</html>

Итак, когда вы нажимаете Run, закрываете всплывающее окно оповещения и делаете «один поток», вы должны увидеть что-то вроде этого:

click begin
click end
result = 20, should be 20

Но если вы попытаетесь запустить это в стабильной версии Opera или Firefox в Windows и свернуть / развернуть окно с всплывающим предупреждением на экране, то будет что-то вроде этого:

click begin
resize
click end
result = 15, should be 20

Я традиционно использовал jQuery

Попробуйте вложить две функции setTimeout друг в друга, и они будут вести себя как многопоточные (то есть ; внешний таймер не будет ждать завершения внутреннего таймера перед выполнением своей функции).