Обратные вызовы вызова функции

javascript ecmascript-6 template-strings template-literals tagged-templates

9174 просмотра

2 ответа

Я не уверен, как это объяснить, но когда я бегу

console.log`1`

В Google Chrome я получаю вывод, как

console.log`1`
VM12380:2 ["1", raw: Array[1]]

Почему обратный вызов вызывает функцию log и почему он создает индекс raw: Array[1]?

Вопрос, поднятый в комнате JS компанией Catgocat, но ответы не имели смысла, кроме того, что касалось шаблонных строк, которые на самом деле не подходили, почему это происходит.

Автор: Sterling Archer Источник Размещён: 12.09.2019 02:40

Ответы (2)


54 плюса

Решение

Это называется Tagged Шаблон более ES-6 можно прочитать о них здесь , смешно , я нашел ссылку в помеченных части самом чате.

Но соответствующая часть кода приведена ниже (вы можете создать фильтрованную сортировку).

function tag(strings, ...values) {
  assert(strings[0] === 'a');
  assert(strings[1] === 'b');
  assert(values[0] === 42);
  return 'whatever';
}
tag `a${ 42 }b`  // "whatever"

По сути, это просто пометка «1» с помощью функции console.log, как это было бы с любой другой функцией. Функции тегирования принимают проанализированные значения строк шаблона и значения отдельно, для которых могут быть выполнены дальнейшие задачи.

Бабель передает приведенный выше код

var _taggedTemplateLiteralLoose = function (strings, raw) { strings.raw = raw; return strings; };

console.log(_taggedTemplateLiteralLoose(["1"], ["1"]));

Как вы можете видеть в приведенном выше примере, после передачи с помощью babel, функция тегирования (console.log) передает значение, возвращаемое следующим переданным кодом es6-> 5.

_taggedTemplateLiteralLoose (["1"], ["1"]);

Возвращаемое значение этой функции передается в console.log, который затем печатает массив.

Автор: ShrekOverflow Размещён: 15.04.2015 08:49

17 плюса

Тег с литералом шаблона:

Следующий синтаксис:

function`your template ${foo}`;

Называется теговым литералом шаблона.


Функция, которая вызывается как тег с литералом шаблона, получает свои аргументы следующим образом:

function taggedTemplate(strings, arg1, arg2, arg3, arg4) {
  console.log(strings);
  console.log(arg1, arg2, arg3, arg4);
}

taggedTemplate`a${1}b${2}c${3}`;

  1. Первый аргумент - это массив всех отдельных строковых символов
  2. Оставшийся аргумент соответствует значениям переменных, которые мы получаем посредством интерполяции строк. Обратите внимание, что в примере нет значения для arg4(потому что интерполируется только три раза) и, таким образом undefined, регистрируется, когда мы пытаемся войтиarg4

Используя синтаксис остальных параметров:

Если мы заранее не знаем, сколько раз будет происходить интерполяция строки в строке шаблона, часто полезно использовать синтаксис параметра rest. Этот синтаксис хранит оставшиеся аргументы, которые функция получает в массив. Например:

function taggedTemplate(strings, ...rest) {
  console.log(rest);
}

taggedTemplate `a${1}b${2}c${3}`;
taggedTemplate `a${1}b${2}c${3}d${4}`;

Автор: Willem van der Veen Размещён: 31.10.2018 01:15
Вопросы из категории :
32x32