Before the explanation, let me point out that `=` is shorthand for [`Set`][1] and `:=` for [`SetDelayed`][2]; this facilitates searching the docs. Also, as Simon Woods points out in a comment to the question, there is a [tutorial][3] on this.

Now, `y[x_]=expr` means evaluate `expr`, then whenever you see `y[something]` evaluate evaluate what resulted. `y[x_]:=expr` means "whenever you see `y[something]`, evaluate `expr` anew".

Here's how to see it:

    a = 5;
    y[x_] = a*x
    
    y[3]
    a = 10
    y[3]
    (*
    15
    10
    15
    *)

That is, when you define `y`, it evaluates the right hand side to `5*x` and assigns that; if you change `a` later, it never sees it. On the other hand,

    a = 5;
    f[x_] := a*x
    
    f[3]
    a = 10
    f[3]
    (*
    15
    10
    30
    *)

Compare also:

    ?? y

![Mathematica graphics](https://i.sstatic.net/28rHs.png)
 
    ??f

![Mathematica graphics](https://i.sstatic.net/t7ijj.png)


  [1]: http://reference.wolfram.com/mathematica/ref/Set.html
  [2]: http://reference.wolfram.com/mathematica/ref/SetDelayed.html
  [3]: http://reference.wolfram.com/mathematica/tutorial/ImmediateAndDelayedDefinitions.html