Well, you can think of a function as a kind of machine that takes in a certain object and outputs another object according to some rule encoded in the machine.
It is considered good practice to specify what type of object is being input and what type is being output. So for example one writes

, where X and Y are defined to contain certain specified types of object.
In the above,

is called the
domain and

is called to
codomain (sometimes called the range space). So the object

is said to be the
image of the object

.
Let's now insist on 2 rules for well-behave functions
1. No function can have more than one image in its codomain
2. Every function must have an image in itscodomain. This can give rise to some difficulty unless we are careful. Consider the function

. This is clearly nonsense when

, so we need to identify the domain as not containing the zero element. There are several notational conventions for this
There is another notational convention that I will get to after this - in what follows please take my words completely literally:
A function is said to be
injective if, fo all

there is
at most one 
such that
A function is said to be
surjective if, for all

there is
at least one 
such that
A function is said to be
bijective if, fo all

there is
at least one and at most one 
such that

.
So, those objects

for which

is called the
pre-image of

, written

. Note from the definition of a surjective function this may be a multiplicity of objects, so the pre-image is a subset of

, and therefore this notation need not imply the "inverse function".
This is also true of bijective functions, even though the pre-image is a single object. Strictly we should call it the "singletion set"

but nobody ever does - just write [tex]x/tex] and so

and

are taken to be mutual inverses.
Anything else? Yeah, loads, but that is the bare bones