Может ли функция никогда не вызываться из-за переключения контекста? - PullRequest
0 голосов
/ 19 февраля 2019

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

Интересно, есть ли переключение контекста / прерывание сразу после (d.readyState=='loading'), может ли обработчик присоединиться после загрузки DOM, и поэтому fn() никогда не будет вызван.

код следующий:

(function(fn){
    var d=document;
    (d.readyState=='loading') ? d.addEventListener('DOMContentLoaded',fn) : fn();
})

(function(){
    doSomething();
});

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

1 Ответ

0 голосов
/ 19 февраля 2019

Ваш код немного запутан, как написано.

Рассмотрим следующий формат:

(function(fn){
  var d=document;
  d.readyState=='loading'
    ? d.addEventListener('DOMContentLoaded',fn)
    : fn();
})(function(){
  alert("hello")
});

Ниже приведен аргумент IIFE .

function(){
  alert("hello")
}

Итак, fn ссылается на вышеуказанную функцию.

Учитывая вышесказанное, fn гарантированно будет вызываться до тех пор, пока срабатывает DOMContentLoaded и до тех пор, пока нет ошибок времени выполнения на одном тике.

Если document.readyStateloading, тогда обработчик событий был бы добавлен в тот же тик.В самое раннее время DOMContentLoaded срабатывает на следующем следующем тике.В противном случае, fn вызывается немедленно.

Чтобы узнать больше о цикле событий JavaScript, я настоятельно рекомендую это видео:

https://youtu.be/cCOL7MC4Pl0

...