JavaScript гарантированно будет однопоточным?

Я думаю, что какое-то объяснение ответа Джона было бы конструктивным. Следующее:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

проверяет, что если указанный файл или каталог соответственно не существует, то правило перезаписи продолжается:

RewriteRule ^(.*)\.html$ /$1 [L,R=301]

Но что это значит? Он использует регулярное выражение (регулярные выражения) . Вот немного чего-то, что я сделал ранее ...

I думаю, это правильно.

ПРИМЕЧАНИЕ. При тестировании вашего .htaccess не используют 301 переадресацию. Используйте 302 до завершения тестирования, так как браузер будет кэшировать 301-е. См. https://stackoverflow.com/a/9204355/3217306

Обновление: я был слегка ошибочен, . соответствует всем символам, кроме строк новой строки, поэтому включает пробелы. Кроме того, здесь является полезным чит-листом regex

Источники:

http://community.sitepoint.com/t/what-does -this-mean-rewritecond-request-filename-fd / 2034/2

https://mediatemple.net/community/products/dv/204643270/using-htaccess- переписать-правила

575
задан Michał Perłakowski 12 April 2016 в 16:54
поделиться

7 ответов

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

Обычно считается, что JavaScript имеет единственный поток выполнения, видимый для скриптов (*), так что при вводе вашего встроенного скрипта, прослушивателя событий или тайм-аута вы полностью контролируете, пока не вернетесь из конца блока или функция.

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

Однако на самом деле это не 'Не совсем правда , подлыми противными способами.

Самый частый случай - немедленные события. Браузеры сразу активируют их, когда ваш код что-то вызывает:

 var l = document.getElementById ('log'); var i = document.getElementById ('inp'); i.onblur = function () {l.value + = 'размытие \ п'; }; setTimeout (function () {l.value + = 'войти в систему \ n'; l.focus (); l.value + = 'выйти из системы \ n';}, 100); i.focus (); 
   

Результатов в входа в систему, размытие, выйдите из системы на всех устройствах, кроме IE. Эти события запускаются не только потому, что вы вызвали focus () напрямую, они могут произойти из-за того, что вы вызвали alert () , или открыли всплывающее окно, или что-то еще, что движется фокус.

Это также может привести к другим событиям. Например, добавьте i.onchange listener и введите что-нибудь во входных данных до того, как вызов focus () расфокусирует его, и порядок журнала будет войти, изменить, размыть, выйти , кроме Opera где это вход в систему, размытие, выход из системы, изменение и IE, где (еще менее объяснимо) вход в систему, изменение, выход из системы, размытие .

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

(Здесь я использую свойства прямого обработчика событий on ... , но то же самое происходит с addEventListener и attachEvent .)

Также существует множество обстоятельств, при которых события могут срабатывать, пока ваш код встроен, несмотря на то, что вы не сделали ничего , чтобы спровоцировать его. Пример:

 var l = document.getElementById ('log'); document.getElementById ('act'). onclick = function () {l.value + = 'предупреждение в \ n'; предупреждение ('предупреждение!'); l.value + = 'предупреждение \ п'; }; window.onresize = function () {l.value + = 'изменение размера \ n'; }; 
   

Hit alert , и вы получите модальное диалоговое окно. Никакой больше скрипт не будет выполняться, пока вы не закроете этот диалог, да? Неа. Измените размер главного окна, и вы получите предупреждение , изменение размера, предупреждение в текстовой области.

Вы можете подумать, что невозможно изменить размер окна, пока открыто модальное диалоговое окно, но это не так: в Linux вы можете изменять размер окна, сколько захотите; в Windows это не так просто, но вы можете сделать это, изменив разрешение экрана с большего на меньшее, если окно не помещается, что приведет к изменению его размера.

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

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

  • , когда модальные всплывающие окна ( предупреждение , подтверждают , приглашение ) открыты во всех браузерах, кроме Opera;

  • во время showModalDialog в браузерах, которые его поддерживают;

  • диалоговое окно «Сценарий на этой странице может быть занят ...», даже если вы решите позволить скрипту продолжить выполнение, позволяет запускать и обрабатывать такие события, как изменение размера и размытие, даже когда скрипт находится в середине цикла занятости, за исключением Opera.

  • Некоторое время назад для меня в IE с подключаемым модулем Sun Java вызов любого метода в апплете мог разрешить запуск событий и повторный ввод сценария. Это всегда была ошибка, зависящая от времени, и, возможно, Sun исправила ее с тех пор (я, конечно, на это надеюсь).

  • , наверное, больше. Прошло много времени с тех пор, как я это тестировал, и с тех пор браузеры стали усложняться.

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

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

566
ответ дан 22 November 2019 в 22:05
поделиться

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

Добавьте к этому тот факт, что HTML5 уже определяет Web Workers (явный, стандартизованный API для многопоточного кода javascript), введение многопоточности в базовый Javascript будет по большей части бессмысленным.

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

112
ответ дан 22 November 2019 в 22:05
поделиться

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

16
ответ дан 22 November 2019 в 22:05
поделиться

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

10
ответ дан 22 November 2019 в 22:05
поделиться

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

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

7
ответ дан 22 November 2019 в 22:05
поделиться

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

7
ответ дан 22 November 2019 в 22:05
поделиться

Ну, Chrome является многопроцессорным, и я думаю, что каждый процесс имеет дело со своим собственным кодом Javascript, но насколько код знает, это "однопоточный ".

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

3
ответ дан 22 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: