По крайней мере согласно спецификациям (реализация никогда не гарантируется). Да, гарантируется, что событие загрузки запускает в конце «выполнения блока скрипта» , но... Я не уверен, что это гарантирует, что ваш обработчик событий будет вызван после.
Так что вы наверняка можете столкнуться с [out-1] и [out-2], но [out-3] менее понятен.
Когда вы добавляете элемент в документ, он будет загружен как скрипт async
.Это означает, что порядок выполнения между script-1 и script-2 не может быть гарантирован.
// scr1 will load an external script
const scr1 = document.createElement('script');
scr1.onload = e => console.log('1', window.$);
scr1.src = 'https://cdn.jsdelivr.net/gh/jquery/jquery@3.2/dist/jquery.js?' + Math.random();
// scr2 will load a dataURL script
const scr2 = document.createElement('script');
scr2.onload = e => console.log('2', window.$);
scr2.src = 'data:application/javascript,$="script 2"';
// even though scr1 is appended first
document.head.appendChild(scr1);
document.head.appendChild(scr2);
Однако, хотя они и просят запустить событие в конце выполнения сценария блока algortithm, я должен признать, что не ясно, есливозможно, что когда-либо возникнет условие состязания и что два исполняют блок сценария до того, как будет обработан первый обработчик события загрузки (поскольку он может быть вызван только при следующем цикле событий).
Но я думаю, мы можем предположить, что все в порядке, так как шансы на это очень малы.
Кроме того, кажется, что по крайней мере Firefox и Chrome выполняют обратный вызов события в том же цикле событий, что ивызвало событие (между выполнением сценария и обратным вызовом при загрузке прошло менее 1 мс).
// both will load a dataURL where the execution time will get stored (minimal time possible)
// in onload events we will log
// both the script's execution time and the event's handler time
const scr1 = document.createElement('script');
scr1.onload = e =>
console.log('1', window.$, performance.now());
scr1.src = 'data:application/javascript,$=performance.now()';
const scr2 = document.createElement('script');
scr2.onload = e =>
console.log('2', window.$, performance.now());
scr2.src = 'data:application/javascript,$=performance.now()';
document.head.appendChild(scr1);
document.head.appendChild(scr2);