Deklaracja funkcji jest taka sama jak deklaracja procedury z wyjątkiem specyfikacji typu rezultatu. Deklaracja posiada postać:
function NazwaFunkcji(ListaParametrow): TypRezultatu; dyrektywy; LokalneDeklaracje; begin Instrukcje end;
gdzie:  NazwaFunkcji jest poprawnym identyfikatorem, TypRezultatu jest identyfikatorem typu, Instrukcje są sekwencją instrukcji wykonywaną podczas wywołania funkcji; (ListaParametrow), dyrektywy i LokalneDeklaracje są opcjonalne.
Zasady posługiwania się identyfikatorami wewnątrz funkcji są takie same jak w przypadku procedury. Dodatkowo, nazwa funkcji działa jak specjalna zmienna, która przechowuje wartość zwracaną przez funkcję. Zamiast niej można używać predefiniowanego identyfikatora Result.
Na przykład:
function WF: Integer; begin WF := 17; end;
definiuje bezparametrową funkcję o nazwie WF, zwracającą wartość całkowitą: 17. Jest to równoznaczne z deklaracją:
function WF: Integer; begin Result := 17; end;
Bardziej złożony przykład:
function Max(A: array of Real; N: Integer): Real; var X: Real; I: Integer; begin X := A[0]; for I := 1 to N - 1 do if X < A[I] then X := A[I]; Max := X; end;
Można wielokrotnie przypisywać różne wartości do identyfikatora Result lub do nazwy funkcji. Kiedy wykonanie funkcji kończy się, ostatnia wartość przypisana do Result lub do nazwy funkcji zostanie zwrócona jako wartość funkcji. Przykład:
function Power(X: Real; Y: Integer): Real; var I: Integer; begin Result := 1.0; I := Y; while I > 0 do begin if Odd(I) then Result := Result * X; I := I div 2; X := Sqr(X); end; end;
Result i nazwa funkcji zawsze reprezentują tę samą wartość. Dlatego funkcja:
function MyFunction: Integer; begin MyFunction := 5; Result := Result * 2; MyFunction := Result + 1; end;
zwraca wartość 11. Jednak identyfikator Result nie jest w pełni równoważny z nazwą funkcji. Jeśli nazwa funkcji pojawi się z lewej strony instrukcji przypisania, kompilator interpretuje to jako wskazanie nowej wartości zwracanej przez funkcję, jeśli nazwa funkcji wystąpi w jakimkolwiek innym miejscu, kompilator zinterpretuje to jako rekurencyjne wywołanie tej samej funkcji. W odróżnieniu, identyfikator Result w dowolnym przypadku może być używany jak zwykła zmienna.
Nie wolno redeklarować identyfikatora Result.