Эта функция вызывается немедленно и возвращает другую функцию. Эта возвращаемая функция затем назначается слушателем mousedown.
Это может быть настолько запутанным из-за попытки создать переменную в области функций _temp
, чтобы выйти из проблема замыкания внутри петель. Если ES2015 разрешен, это будет гораздо яснее. Код эквивалентен:
// ES2015
const keyCode = reverseLookup[n + ',' + i];
thisKey.addEventListener('mousedown', () => {
fnPlayKeyboard({ keyCode });
});
. Для получения * требуется переменные n
и i
, какими бы они ни были, и поиск их по reverseLookup
, который, предположительно, является объектом. 1012 *. Затем, когда thisKey
получает событие mousedown
, он вызывает fnPlayKeyboard
с объектом с этим keyCode
.
Код не обязательно эквивалентен
// Pre-ES2015
var keyCode = reverseLookup[n + ',' + i];
thisKey.addEventListener('mousedown', function() {
fnPlayKeyboard({ keyCode: keyCode });
});
, потому что, если код находится внутри al oop, для keyCode
будет только одна привязка (которая будет конечным значением, присвоенным ему на последней итерации l oop):
// Pre-ES2015
for (var i = 0; i < 10; i++) {
var keyCode = reverseLookup[n + ',' + i];
thisKey.addEventListener('mousedown', function() {
fnPlayKeyboard({ keyCode: keyCode });
});
}
Приведенный выше код не будет работать должным образом, но исправление его путем объявления переменной с const
вместо этого разрешено только в средах ES2015 +. В более старых средах немедленный вызов анонимного (function(_temp) { return function() {
в addEventListener
является одним из способов убедиться, что у слушателя будет правильный keyCode
при вызове, путем создания переменной области действия (параметр _temp
) только для этот слушатель.