Was ist mit "erstklassigem Objekt" gemeint?

146

In einer kürzlich gestellten Frage erhielt ich Vorschläge, um unter anderem über den Aspekt von JavaScript zu sprechen, bei dem Funktionen erstklassige Objekte sind. Was bedeutet die "erste Klasse" in diesem Zusammenhang im Gegensatz zu anderen Objekten?

EDIT (Jörg W Mittag): Exaktes Duplikat: "Was ist ein erstklassiges Programmierkonstrukt?"

ProfK
quelle
3
Mögliches Duplikat von Was ist ein erstklassiges Programmierkonstrukt?
Jörg W Mittag

Antworten:

179

Um Wikipedia zu zitieren :

In der Informatik soll eine Programmiersprache erstklassige Funktionen (oder Funktionsliterale) unterstützen, wenn sie Funktionen als erstklassige Objekte behandelt. Dies bedeutet insbesondere, dass die Sprache das Erstellen neuer Funktionen während der Ausführung eines Programms unterstützt, diese in Datenstrukturen speichert, sie als Argumente an andere Funktionen übergibt und sie als Werte anderer Funktionen zurückgibt.

Diese Seite illustriert es auch sehr schön:

Wirklich, genau wie jede andere Variable

  • Eine Funktion ist eine Instanz des Objekttyps
  • Eine Funktion kann Eigenschaften haben und einen Link zurück zu ihrer Konstruktormethode haben
  • Sie können die Funktion in einer Variablen speichern
  • Sie können die Funktion als Parameter an eine andere Funktion übergeben
  • Sie können die Funktion von einer Funktion zurückgeben

Lesen Sie auch den Kommentar von TrayMan, interessant ...

Schleifer Versluys
quelle
11
Wikipedia zu zitieren ist nett und gut, aber die Beschreibung ist in einer Sprache für Wissenschaftler und nicht für Geeks geschrieben. Was zum Teufel bedeutet das alles überhaupt? Der letzte Satz in diesem Zitat ist vage.
Spoike
1
@Spoike, true ... bereitgestellte Javascript-Ressource.
Sander Versluys
16
Praktischerweise hat eine Sprache mit erstklassigen Funktionen auch Funktionen höherer Ordnung, anstatt sich auf Funktionen erster Ordnung zu beschränken, die erstklassige Funktionen ausschließen würden. (Obwohl höherwertig, ist nicht erstklassig möglich.)
TrayMan
5
Ich habe im Wikipedia-Zitat nichts Unklares gefunden, aber der zusätzliche Link ist ausgezeichnet.
ProfK
4
Der Link funktioniert nicht mehr (nach ca. 8 Jahren).
DoubleOrt
47

Der Begriff "erstklassige Funktionen" in einer Programmiersprache wurde in den 1960er Jahren vom britischen Informatiker Christopher Strachey eingeführt . Die bekannteste Formulierung dieses Prinzips ist wahrscheinlich die Struktur und Interpretation von Computerprogrammen von Gerald Jay Sussman und Harry Abelson:

  • Sie können durch Variablen benannt werden.
  • Sie können als Argumente an Prozeduren übergeben werden.
  • Sie können als Ergebnis von Verfahren zurückgegeben werden.
  • Sie können in Datenstrukturen enthalten sein.

Grundsätzlich bedeutet dies, dass Sie mit Funktionen alles tun können, was Sie mit allen anderen Elementen in der Programmiersprache tun können. Im Fall von JavaScript bedeutet dies, dass alles, was Sie mit einer Ganzzahl, einem String, einem Array oder einer anderen Art von Objekt tun können, auch mit Funktionen möglich ist.

Jörg W Mittag
quelle
14

Vollständigere Genehmigung der Formulierung von Strachey-Sussman-Abelson. Wenn Ihre Sprache ein solches Konstrukt unterstützt, haben Sie eine Funktion als erstklassige Sprache :)

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... :)

Kurz gesagt, alles ist ein erstklassiges Objekt, wenn es in der Sprache als Zustandsmanipulationsart oder Objekttyp fungiert. Einfach etwas, das Sie bearbeiten und Anweisungen weitergeben und gleichzeitig in Ausdrücken auswerten können. Oder noch kürzer: Wenn Sie sich eine Funktion als ein Objekt vorstellen können, das zusätzlich aufgerufen werden kann.

Arman McHitarian
quelle
9

JavaScript-Funktionen sind erstklassige Funktionen, dh Funktionen und Objekte werden als gleich behandelt. Funktionen können als Variable in einem Objekt oder Array gespeichert sowie als Argument übergeben oder von einer anderen Funktion zurückgegeben werden. Das macht Funktion "erstklassige Bürger in JavaScript"

JavaScript verwendet die Syntax der Literalnotation, wodurch es schwierig wird, die Tatsache vollständig zu erfassen, dass Funktionen in JavaScript Objekte sind.

Beispielsweise..

var youObj1 = new Object();
// or
var youObj1 = {};

Beide Deklerationen sind gleichwertig. Mit using newrufen wir die Konstruktorfunktion eines Objekts auf. Auch mit {}(JavaScript-Verknüpfung namens Literale) rufen wir die Konstruktionsfunktion eines Objekts auf. {}ist nur eine kürzere Darstellung zum Instanziieren des Konstruktors.

In den meisten Sprachen wird newein Objekt mit einem Schlüsselwort erstellt. Erstellen Sie daher ein JavaScript-Objekt.

var myFunction = new Function("a",  "b", 'return a_b');

Wie Sie sehen wir erstellt einen Objektnamen - Funktion .

Erstellen derselben Objektnamenfunktion mit dem JavaScript-Funktionsausdruck.

var myFunction = function myFunction(a,b) {
    return a+b;
}

Los geht's, wir haben gerade eine Objektnamenfunktion erstellt.

Mark Adler
quelle
9

In Javascript sind Funktionen erstklassige Objekte, da sie viel mehr können als Objekte.

  • Eine Funktion ist eine Instanz eines Objekttyps.

Function instanceof Object //returns true

Wie ein Objekt kann eine Funktion Eigenschaften haben und einen Link zurück zu ihrer Konstruktorfunktion haben.

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • Funktionen können in einer Variablen als Wert gespeichert werden.

  var foo = function(){}; 
    console.log(foo); // function(){}

  • Funktionen können als Argumente an andere Funktionen übergeben werden

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • Sie können eine Funktion von einer Funktion zurückgeben

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • Kann in einer Variablen als Referenz gespeichert werden.

    var sum = function (a,b){return a+b}  
    sum(4,4);

Sagar Munjal
quelle
Ein Objekt kann das alles auch.
DoubleOrt
5

Einfacher Test. Wenn Sie dies in Ihrer Sprache tun können (Python als Beispiel):

def double(x):
    return x*x

f = double

print f(5) #prints 25

Ihre Sprache behandelt Funktionen als erstklassige Objekte.

Yuval Adam
quelle
3
Aber ich kann dies in C ++ tun: int zweimal (int x) {return x << 1; } int (* f) (int) = zweimal; std :: cout << (* f) (5) << std :: endl; Bedeutet das, dass C ++ Funktionen als erstklassige Objekte behandelt (mit einer lustigen Syntax)?
Thomas L Holaday
1
Bis Sie eine Funktion innerhalb einer Funktion erstellen können, möchte ich nein sagen.
CHao
1
C-Funktionszeiger unterstützen (eine sehr eingeschränkte Definition von) erstklassige Funktionen, aber Funktionen sind keine Objekte. Funktionszeiger in C enthalten weder Status noch Verhalten.
Steven Kramer
2

Dies bedeutet, dass Funktionen Objekte mit einem Typ und einem Verhalten sind. Sie können dynamisch erstellt, wie jedes andere Objekt weitergegeben werden, und die Tatsache, dass sie aufgerufen werden können, ist Teil ihrer Schnittstelle.

Cadrian
quelle
2

Dies bedeutet, dass die Funktion tatsächlich von Object erbt. Damit Sie es weitergeben und wie mit jedem anderen Objekt damit arbeiten können.

In c # müssen Sie jedoch auf Delegierte oder Reflexionen verzichten, um mit Funktionen herumzuspielen. (Dies wurde in letzter Zeit mit Lambda-Ausdrücken viel besser)

Rashack
quelle
2

Die Definition auf der Mozilla-Site ist präzise und klar. Nach ihnen,

In JavaScript sind Funktionen erstklassige Objekte, da sie wie jedes andere Objekt Eigenschaften und Methoden haben können . Was sie von anderen Objekten unterscheidet, ist, dass Funktionen aufgerufen werden können. Kurz gesagt, sie sind Funktionsobjekte.

Und

Eine Funktion ist ein "Unterprogramm", das durch Code außerhalb (oder intern im Fall einer Rekursion) der Funktion aufgerufen werden kann. Wie das Programm selbst besteht eine Funktion aus einer Folge von Anweisungen, die als Funktionskörper bezeichnet werden. Werte können an eine Funktion übergeben werden, und die Funktion gibt einen Wert zurück.

Arpit
quelle
0

Ich denke, wenn etwas in einer Sprache erstklassig ist, bedeutet dies, dass es eher von seiner Syntax als von einer Bibliothek oder einem syntaktischen Zucker unterstützt wird. Beispielsweise sind Klassen in C keine erste Klasse

Jiang Qiu
quelle
0

Einfach in JavaScript sind Funktionen erstklassige Objekte, dh Funktionen sind vom Typ Objekt und können wie jedes andere Objekt (String, Array, Number usw.) erstklassig verwendet werden, da es sich tatsächlich um Objekte handelt sich. Sie können in Variablen gespeichert, als Argumente an Funktionen übergeben, innerhalb von Funktionen erstellt und von Funktionen zurückgegeben werden

Santi
quelle