JavaScript гарантированно будет однопоточным? - PullRequest
574 голосов
/ 29 апреля 2010

JavaScript известен как однопоточный во всех современных реализациях браузеров, но это указано в каком-либо стандарте или это просто по традиции? Совершенно безопасно предположить, что JavaScript всегда однопоточный?

Ответы [ 12 ]

1 голос
/ 26 июля 2016

Я попробовал пример @ 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 begin\n';

            s = 10;
            let s2 = s;

            alert('alert!');

            s = s + s2;

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

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

            l.value+= 'resize\n';
        });
    </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

Я не хочу сказать, что это "многопоточность", но какой-то фрагмент кода был выполнен в неподходящее время, и я этого не ожидал, и теперь у меня поврежденное состояние. И лучше узнать об этом поведении.

0 голосов
/ 15 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...