Я не уверен, что кто-то там сможет помочь с этим, но здесь идет. В настоящее время я реорганизую игру, которую пишу с помощью CraftyJS (отличный игровой движок на основе компонентов) для использования RequireJS. Все прошло неплохо, но внезапно я попал в ловушку. Я создал модуль, в котором я определяю небольшой компонент Crafty, который в основном является узким местом для прослушивания событий. В одном из обратных вызовов я вызываю несколько функций, которые определены в локальном модуле. Я использовал этот шаблон в RequireJS во многих контекстах, и он всегда работал для меня. По некоторым причинам в этом случае функции не определены. Не все из них. Лишь некоторые. Вот код:RequireJS некоторые (не все) функции не определены
Компонент:
Crafty.c("TurnStateMachineObserver", {
startListening: function() {
...
this.bind(POST+PHASE_CHANGE, function(e) {
// this is called after the phase change has already been
// applied. now, switch to the next phase, if appropriate.
var curPhase = currentPhase();
var nextPhase = nextPhase();
if (nextPhase === PHASE_TURN_START)
_triggerPlayerChange(nextPlayer());
else if (curPhase !== PHASE_MAIN)
_triggerPhaseChange(nextPhase());
})
.bind(POST+RESET, function(e) {
reset();
});
},
...
});
Для тех из вас знакомы с лукаво, Crafty.c
создает компонент, который впоследствии может быть инстанцированный. Литеральный объект передается, поскольку второй аргумент будет добавлен (расширен?) К любому объекту, который включает TurnStateMachineObserver
в качестве одного из его компонентов (то есть с использованием Crafty.e("TurnStateMachineObserver")
).
Функции, используемые внутри компонента определены позже в том же файле (весь файл упаковывается в define()
вызова):
// Function: currentPhase
// The current <Turn Phase>.
function currentPhase() {
if (_currentPhaseIndex < 0) _currentPhaseIndex = 0;
return PHASES[_currentPhaseIndex];
}
// Function: nextPhase
// The phase following the <currentPhase>. Order follows the
// <PHASES> list.
function nextPhase() {
var phaseIndex = _currentPhaseIndex + 1;
phaseIndex %= PHASES.length;
return PHASES[phaseIndex];
}
Теперь, когда POST+PHASE_CHANGE
событие вызывается, исключение брошено звонок по телефону nextPhase()
, но НЕ по телефону currentPhase()
! После некоторой отладки я определил, что, фактически, в то время как все функции, определенные в модуле, правильно определены при первом вводе тела define()
, из них не определены внутри обратных вызовов компонента. На самом деле, когда компонент инстанциируется
if (!_observer)
_observer = Crafty.e("TurnStateMachineObserver");
_observer.startListening();
в init
функции (которой модуль возвращается), nextPhase()
определяется, но если я шаг в _observer.startListening()
, это не так, хотя currentPhase()
есть. Argh! Я вытягиваю то, что осталось от моих волос. Дело в том, что я действительно смущен в том, что эти функции являются братьями и сестрами. Как определить некоторые функции из более высокого уровня, а другие нет?