Consider this code which sets up a context in which x, y, and f are defined and in which f 3 is to be evaluated.

let x = 1
    y = 2
    f 0 = x
    f x = (x+y) * (f (x-1))
 in f 3

In the part where the definitions of x, y, and f reside there is another context containing the actual definition of f for nonzero arguments. The x in the definition of f is not the same as the x which is bound to 1. Being a parameter this x only has a value when a particular f x is being evaluated.

I assume readers know that the y in this definition of f represents 2. This is normal static scoping of programming languages. You will sometimes hear that y is free in this definition of f. This is because as far as the definition of f is concerned y can be any value for which the plus operator works. However this particular context is contained in an outer context where y is bound to 2. Since y is not a parameter or defined in a let expression it keeps the binding from the outer context.