In this simple flow, context.total holds a running total of msg.payload, yet there is no context.get or context.set.
The debug panel Context Data shows empty for the Function node and the Flow.
So what exactly is context.total and how does it retain data over several messages?
Am I creating a global variable that just happens to have a dot in it's name?
You are creating a property of the context object itself.
That is different to adding a value to context using set.
This is a valid way of predefining variables in the on start tab of the Function node and accessing them in the on message code, without going to the extent of storing inside context itself.