Каковы общие правила для каких выражений будут отображаться предварительный текст Chrome DevTools «Eager Assessment»? - PullRequest
1 голос
/ 27 марта 2019

В качестве опции, начиная с Chrome 68 (по умолчанию включено с Chrome 72 или, возможно, ранее), консоль DevTools выполняет предварительный предварительный просмотр результатов «нетерпеливой оценки» для определенных выражений.

Например, если вы введете

encodeURIComponent(document.querySelector('.top-bar .-logo').innerHTML);

, вы получите розовый предварительный просмотр

"%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Cspan%20class%3D%22-img%20_glyph%22%3EStack%20Overflow%3C%2Fspan%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"

ниже, не нажимая Enter.

Thisоднако не работает, скажем,

document.querySelector('.top-bar .-logo').href;

и (как и следовало ожидать) не работает с выражениями, содержащими циклы.

Документировано ли где-то, какие выражения будутработать с этим, а что не будет? Первоначальное объявление о функции упоминает

DevTools не стремится оценить, вызывает ли выражение побочные эффекты .

, ноэто, кажется, не объясняет, почему это будет работать для .innerHTML, но не для .href.

Что именно определяет, какие выражения он будет пытаться оценить?

1 Ответ

2 голосов
/ 02 апреля 2019

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

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

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

Например,

const o = {
  _count: 0,
  get count() { return this._count++; }
};

Оттуда, оценка o.count будет увеличивать свойство _count, и, таким образом, этот метод получения помечается как небезопасный.

Теперь я должен признать, что я не уверен, что внутренне вызывает .href, и почему этот алгоритм пометит его как небезопасный, но ясно, что что-то есть ... И если вы абсолютно хотите знать, что это такое, тогда вы можете проверить document.baseURI внутренности, которые должны вызываться с .href и которые помечены как небезопасные.

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