Now think about the nature of ON TIMER, you define a time interval for the function call, but who says that your program is right executing anywhere in your main module when the interval is elapsed and the DoSomething(X) function is called.
What happens, when your program is executing within any of your SUBs or FUNCTIONs when the timer is ready to call DoSomething(X)? What is passed then? Because variable X is not known in your SUBs/FUNCs unless SHARED or maybe defined as a local X within the SUB/FUNC.
That should be up to the programmer to keep track of, at that point it is their responsibility. And I have ran into that, where I didn't want a TIMER event to run while certain SUBs were running, and had to turn TIMER off anytime those SUBs were running then back on when they returned.
That is all on the Programmer.
Another situation is where X could be different in each SUB or FUNCTION too and maybe you want that to be part of the program so the TIMER CALLed routine actually does something different depending on where in the program its happening.
If everything has to be SHARED then nothing in your program would work outside that program, so you couldn't make a Library of code for use in multiple programs. each one would have to be tailor made and that is not very helpful or fast.
TIMERs are actually very powerful tools, and need to be used responsibly to begin with.