Понимание литерала шаблона с меткой 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} в первом примере.

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