Javascript Es6 Tagged Templates - Когда используется raw? Когда готовится используется?

После изучения этого примера шаблона тега Es6:

var yo = func`${x} + ${y}\n= ${x + y}`;

one@public-node ~/es6 $ 6to5 tag.js 
"use strict";

var _taggedTemplateLiteral = function (strings, raw) {
  return Object.freeze(Object.defineProperties(strings, {
    raw: {
      value: Object.freeze(raw)
    }
  }));
};

var yo = func(_taggedTemplateLiteral(["", " + ", "\n= ", ""], ["", " + ", "\\n= ", ""]), x, y, x + y);

Я вижу, что возвращается var yo = func(strings, raw, x, y, x + y);

Я понимаю основы строковых литералов и xy значения вставляются. Чего я не понимаю, так это... когда используются строки, а не используются? Так как функция имеет как массивы, так и пользователь не имеет возможности сообщить ей, когда использовать raw, а когда использовать cooked(строки).

1 ответ

Решение

Функция тега func передается только один массив. Этот массив происходит от _taggedTemplateLiteral функция, которая принимает входящий параметр "strings" и добавляет к нему единственное свойство.

Функция func будет объявлен так (в стиле ES5):

function func(strings) {
  var params = [].slice.call(arguments, 1);
  // do stuff
}

Если внутри func код, необходимый для использования "сырых" строк, он просто получит доступ к .raw свойство переменной "strings":

function func(strings) {
  var params = [].slice.call(arguments, 1);

  var raw2 = strings.raw[2];

  // do stuff
}

Таким образом, "пользователь" - автор функции тега - имеет контроль. Код в функции тега может свободно проверять исходное содержимое частей шаблона в любое время. Вероятно, это тот случай, когда функции тегов, которые по существу реализуют DSL, могут захотеть использовать только необработанные строки, в то время как более простые механизмы шаблонов не будут заботиться и будут рады использовать "разобранные" строки.

Другие вопросы по тегам