Variables and functions reside in different namespaces in dash and this is also specified by POSIX:
The implementation shall maintain separate name spaces for functions and variables.
In addition to that, variables have global scope, by default. Some shells (e.g. bash, ksh and zsh) provide the
local keyword to declare variables in a function with local scope only.
So, yes, the behavior you are seeing is guaranteed by POSIX.
POSIX hasn't standardized
The description of functions in an early proposal was based on the notion that functions should behave like miniature shell scripts; that is, except for sharing variables, most elements of an execution environment should behave as if they were a new execution environment, [..]
[..] Local variables within a function were considered and included in another early proposal (controlled by the special built-in
local), but were removed because they do not fit the simple model developed for functions and because there was some opposition to adding yet another new special built-in that was not part of historical practice. Implementations should reserve the identifier
local (as well as
typeset, as used in the KornShell) in case this local variable mechanism is adopted in a future version of this standard.