Les mathématiciens définissent maintenant les fonctions comme des relations, c'est-à-dire des sous-ensembles du produit cartésien de deux ensembles qui vérifient simplement des propriétés d'existence et d'unicité (tout élément a une image et une seule) : c'est ainsi que les fonctions sont comprises en théorie des ensembles.
Les informaticiens n'adoptent pas cette définition pour au moins deux raisons : d'une part, une fonction n'est pas seulement un ensemble de couples, mais est une méthode de calcul (ou algorithme), et d'autre part une fonction, pour un argument donné, peut ne pas toujours rendre le même résultat (c'est heureusement le comportement de la fonction Math.random() de génération de nombres pseudo-aléatoires). C'est notamment le cas des méthodes de Java, dont la valeur ne dépend pas seulement de la valeur de ses arguments, mais aussi de l'état interne de l'instance à laquelle elle est appliquée, c'est-à-dire de la valeur de ses champs.
On définit une méthode par son en-tête et son corps, c'est-à-dire :
Sauf quand le type de retour est void, le corps d'une méthode contient au minimum une instruction << return expression; >> qui permet de communiquer son résultat. Quand le type du résultat est void , son corps peut contenir l'instruction << return; >>, mais ce n'est pas obligatoire.