Plus complète approbation de Strachey-Sussman Abelson de la formulation. Donc, si votre langue prend en charge une telle construction vous avez une fonction de première classe de langue :)
var men = function (objectOfAdmiration) {
return objectOfAdmiration();
};
men.isSweetHeart = true;
var women = function (objectOfAdmiration) {
return objectOfAdmiration();
};
women.isSweetHeart = true;
var aliens = function (objectOfAdmiration) {
return objectOfAdmiration();
};
function like(obj){
if (obj.isSweetHeart) {
return function (){ return "Holy TRUE!"};
}
else {
return function (){ return "Holy CRAP!"};
}
}
alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"
alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)
//women(like(aliens)); // Who knows? Life is sometimes so unpredictable... :)
En bref, tout ce qui est de la première classe de l'objet, si elle agit dans la langue comme une manipulation de l'état de tri d'un objet ou le type d'un objet. Tout simplement quelque chose que vous pouvez faire fonctionner et de faire passer les déclarations et les évaluer dans les expressions, dans le même temps.
Ou encore plus court: quand vous pouvez penser à une fonction d'un objet qui peut en plus être invoquée.