For myself, I tend to lean towards the JIT (Just In Time) approach. Whenever I can, I try to make modularized functions self-initializing. The "action-engine" design pattern that Ben Rayner formalized a few years back is a good model.
For state machines, I like to have a clearly defined initialization state -- even if right now it will only run once. Having it as a separate state simplifies the changes if the machine ever needs to reinitialize itself.
Knowing when and where to initialize things can sometimes be tricky -- and highly dependent upon system requirements.
Mike...