Imagine a turing machine running forever on an infinite input tape of binary digits, and writing to an output tape of binary digits. This defines a computable function $f : \mathbf{R} \to \mathbf{R}$.^{1}
We assume all turing machines preform no "tape reversals", i.e. once digit $k$ is output it cannot be changed later on. If there were arbitrary tape reversals then the halting problem would prevent us from ever knowing when the first $k$ digits have been output.
Let $x \in \mathbf{R}$ and $\epsilon > 0$. We want a $\delta > 0$ so $x  y < \delta$ implies $f(x)f(y)<\epsilon$.
Compute $f(x)$. at step $n$ our turing machine has computed $k \le n$ digits of $f(x)$ using (at most!) the first $n$ digits of $x$, meaning any $y \in \mathbf{R}$ with the first $n$ digits in common with $x$ must have the first $k$ digits of $f(y)$ equal to $f(x)$! ^{2}
Setting $k$ such that $k$digit agreement implies $\epsilon$closeness, and letting $n$ be the timestep when we finish computing the first $k$ digits allows us to define $\delta$ small enough so the first $n$ digits must agree, finally giving us $xy<\delta \Rightarrow f(x)f(y)<\epsilon$.
See also: this confusing stackexchange post.
Footnotes

Technically $\mathbf{R}$ is only computable numbers (in the output at least, input too if you're defining stuff reasonably (e.g. so computable inverses exist)) ↩

The reason $f(y)$ has also computed $k$ digits after $n$ steps is that $y$ looks the same as $x$ when restricted to $n$ timesteps (since the first $n$ digits agree!), we are assuming "no tape reversals" (after reading more digits of $y$ we decide to go back and edit the first $k$ digits) in our argument. ↩