финальный вопрос - почему функция теряет контекст? 🙂
Ну хз, как-то ты странно делаешь. Функция это first class sitizen ты ее передаешь в другую функцию просто как объект, и ожидаешь что она вызовется в каком-то контексте. Но контекста нет. Она идет в "виртуальный" this и пытается выполнится от туда, но, так как контекта правильного там нет, она очевидно не работает. Чтобы сделать то что ты хочешь, тебе нужно использовать bind или call