OK, so these two ways of functions declaration aren't equivalent.
This is exactly true: these are completely different constructs. Strictly speaking, there are no "function declarations" in Mathematica (in the C language sense). Mathematica has global replacement rules and pure functions.
When you evaluate
f[x_]:=x^2
you define a global replacement rule which replaces each occurrence of an expression which matches f[x_] with x^2.
When you evaluate
f=#^2&
or
f=Function[x,x^2]
you define a global replacement rule which replaces each occurrence of f with Function[#,#^2] or Function[x,x^2] accordingly. The Function has its own logic of evaluation.