This is because GDScript has automatic reference counting and cleanup of orphaned records. When timer goes out of scope, if there is no other reference to it, it will be destroyed. Adding it to the SceneTree creates a reference from an object that will still be around when the timer expires.
jeremyjh | 2016-09-23 04:03
How would you queue_free on the timer from the callback after it’s been used? Or more simply how would you address that object after the function that created it is left?
zyrixian | 2016-10-02 21:07
Do you need to destroy the timer or is it automatically destroyed?
TGMG | 2020-06-27 19:45
Thank you so much! Lost more than 1 hour to resolve so dumb problem