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);
Я понимаю основы строковых литералов и x
y
значения вставляются. Чего я не понимаю, так это... когда используются строки, а не используются? Так как функция имеет как массивы, так и пользователь не имеет возможности сообщить ей, когда использовать 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, могут захотеть использовать только необработанные строки, в то время как более простые механизмы шаблонов не будут заботиться и будут рады использовать "разобранные" строки.