Понимание литерала шаблона с меткой ES6
Следующий фрагмент кода используется в Mozilla ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) для объяснения Tagged Template literal
Пожалуйста, помогите мне понять, что делает следующая функция, я не могу получить фактический поток функции, так как они использовали keys.foreach
и когда я проверял в Chrome, ключи были функцией, поэтому не в состоянии понять
function template(strings, ...keys) {
return (function(...values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
keys.forEach(function(key, i) {
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join('');
});
}
var t1Closure = template`${0}${1}${0}!`;
t1Closure('Y', 'A'); // "YAY!"
var t2Closure = template`${0} ${'foo'}!`;
t2Closure('Hello', {foo: 'World'}); // "Hello World!"
2 ответа
Большая часть сложности в примере проистекает из перегруженной функции и forEach
вызов, а не из тегов литералов шаблона. Лучше было бы написать два отдельных случая:
function dictionaryTemplate(strings, ...keys) {
return function(dict) {
var result = "";
for (var i=0; i<keys.length; i++)
result += strings[i] + dict[keys[i]];
result += strings[i];
return result;
};
}
const t = dictionaryTemplate`${0} ${'foo'}!`;
t({0: 'Hello', foo: 'World'}); // "Hello World!"
function argumentsTemplate(strings, ...keys) {
is (!keys.every(Number.isInteger))
throw new RangeError("The keys must be integers");
return function(...values) {
var result = "";
for (var i=0; i<keys.length; i++)
result += strings[i] + values[keys[i]];
result += strings[i];
return result;
};
}
const t = argumentsTemplate`${0}${1}${0}!`;
t('Y', 'A'); // "YAY!"
Шаблон - это пользовательская функция, определенная нами для анализа строки шаблона, всякий раз, когда используется функция для анализа строки шаблона.
Первый аргумент функции тега содержит массив строковых значений. Остальные аргументы связаны с выражениями.
поэтому здесь конкретно мы написали функцию для данного заданного вывода
Я запутался, потому что, когда проверял ключи внутри forEach, я получал функцию в консоли, но проверка функции перед forEach давала ключи в виде массива настраиваемой строки ${0} и ${1} в первом примере.