После прочтения различных решений я хотел бы добавить, что причина, по которой эти решения работают, заключается в том, чтобы полагаться на концепцию цепочки областей видимости. Это способ, которым 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
, когда внутреннее исполнение выполнено.
Более подробно можно найти здесь . В него входит общая ошибка при создании замыкания в цикле, как то, что мы имеем здесь, а также почему мы нуждаемся в закрытии и рассмотрении эффективности.
{{_ ...}}
вызывает помощника с именем _
. Как сказал Денис, если вы сделали meteor add tap:i18n
, тогда он вызовет помощника из tap: i18n package .
Вы также можете зарегистрировать помощника. Я сделал это, чтобы получить доступ к подчеркиванию в шаблонах:
Template.registerHelper('_', (method, arr) => _[method](arr));
Они не связаны между собой.
_
в js обычно ссылается на библиотеку http://underscorejs.org/
.
_
в вашем шаблоне html скорее ссылается на помощника, установленного в https://github.com/TAPevents/tap-i18n
пакет / библиотека для интернационализации.