Это интересно.У нас есть
Set.constructor`alert(...)```
Давайте сначала рассмотрим эту часть:
Set.constructor`alert(...)`
является теговым литералом шаблона и эквивалентен следующему вызову функции (при условии* * * * * * не содержит ${...}
заполнителей внутри обратных кавычек):
Set.constructor(['alert(...)'])
Set
- это класс, который является функцией в JS, поэтому Set.constructor
равен Function
, то есть приведенное вышетак же, как
Function(['alert(...)'])
или, поскольку Function
преобразует свои аргументы в строки,
Function('alert(...)')
, которая динамически создает функцию из заданного текстового содержимого.
Теперь у нас есть еще два обратных знака, так что наше общее выражение становится:
Function('alert(...)')``
, которое снова является литералом с тегом и эквивалентно вызову функции
Function('alert(...)')([''])
который вызывает нашу вновь созданную функцию с пустым аргументом.
Другими словами, это творческий способ eval
вещей.