Что означает {{_ означает в шаблонах spacebars / blaze? [Дубликат]

После прочтения различных решений я хотел бы добавить, что причина, по которой эти решения работают, заключается в том, чтобы полагаться на концепцию цепочки областей видимости. Это способ, которым JavaScript разрешает переменную во время выполнения.

  • Каждое определение функции формирует область, состоящую из всех локальных переменных, объявленных var и ее arguments.
  • Если у нас есть внутренняя функция, определенная внутри другой (внешней) функции, это образует цепочку и будет использоваться во время выполнения
  • . Когда функция выполняется, среда выполнения оценивает переменные путем поиска цепочки охвата. Если переменная может быть найдена в определенной точке цепи, она перестанет ее искать и использовать, иначе она будет продолжаться до тех пор, пока не достигнет глобального масштаба, который принадлежит window.

В начальном code:

funcs = {};
for (var i = 0; i < 3; i++) {         
  funcs[i] = function inner() {        // function inner's scope contains nothing
    console.log("My value: " + i);    
  };
}
console.log(window.i)                  // test value 'i', print 3

Когда выполнение funcs выполняется, цепочка областей видимости будет function inner -> global. Поскольку переменную i невозможно найти в function inner (ни объявлено с использованием var, ни передано как аргументы), она продолжает поиск, пока значение i не будет найдено в глобальной области видимости window.i .

Обернув его во внешнюю функцию, либо явно определите вспомогательную функцию, как harto , либо использовали анонимную функцию, например Bjorn :

funcs = {};
function outer(i) {              // function outer's scope contains 'i'
  return function inner() {      // function inner, closure created
   console.log("My value: " + i);
  };
}
for (var i = 0; i < 3; i++) {
  funcs[i] = outer(i);
}
console.log(window.i)          // print 3 still

Когда выполняется funcs, теперь цепочка видимости будет function inner -> function outer. На этот раз i можно найти в области внешней функции, которая выполняется 3 раза в цикле for, каждый раз имеет значение i правильно. Он не будет использовать значение window.i, когда внутреннее исполнение выполнено.

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

0
задан canbax 17 May 2016 в 16:23
поделиться

2 ответа

{{_ ...}} вызывает помощника с именем _. Как сказал Денис, если вы сделали meteor add tap:i18n, тогда он вызовет помощника из tap: i18n package .

Вы также можете зарегистрировать помощника. Я сделал это, чтобы получить доступ к подчеркиванию в шаблонах:

Template.registerHelper('_', (method, arr) => _[method](arr));

1
ответ дан Anthony Astige 24 August 2018 в 17:55
поделиться

Они не связаны между собой.

_ в js обычно ссылается на библиотеку http://underscorejs.org/.

_ в вашем шаблоне html скорее ссылается на помощника, установленного в https://github.com/TAPevents/tap-i18n пакет / библиотека для интернационализации.

1
ответ дан Denis Babineau 24 August 2018 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: