Зворотні посилання, що викликають функцію


93

Я не знаю, як це пояснити, але коли я біжу

console.log`1`

У google chrome я отримую результат, подібний

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

Чому зворотний тик викликає функцію журналу і чому він робить індекс raw: Array[1]?

Питання, яке підняв Catgocat у кімнаті JS, але жодна відповідь не мала сенсу, крім чогось щодо шаблонування рядків, які насправді не відповідали тому, що це відбувається.


Відповіді:


68

Це називається Tagged Template у 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, як це було б зроблено з будь-якою іншою функцією. Функції тегування приймають проаналізовані значення рядків шаблонів та значення окремо, за якими можна виконувати подальші завдання.

Babel транслює вищевказаний код до

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, який потім надрукує масив.


10
Я виявив, що це набагато легше зрозуміти пояснення
Дейв Пайл

34

Позначений літералом шаблон:

Наступний синтаксис:

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(оскільки існує лише 3 рази інтерполяції рядків) і, отже undefined, реєструється, коли ми намагаємося ввійтиarg4

Використання синтаксису параметра rest:

Якщо ми заздалегідь не знаємо, скільки разів буде виконуватися інтерполяція рядків у рядку шаблону, часто корисно використовувати синтаксис параметра rest. Цей синтаксис зберігає решту аргументів, які функція отримує, у масив. Наприклад:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.