2009-04-01 9 views
115

In un recent question, ho ricevuto suggerimenti per parlare, tra le altre cose, dell'aspetto di JavaScript in cui le funzioni sono oggetti di "prima classe". Cosa significa "prima classe" in questo contesto, al contrario di altri oggetti?Cosa si intende per "oggetto di prima classe"?

EDIT (Jörg W Mittag): Exact Duplicate: "What is a first class programming construct?"

+1

possibile duplicato di [Che è una prima classe di programmazione costrutto?] (Http://stackoverflow.com/questions/646794/what-is-a-first-class- programming-construct) –

risposta

144

Per citare Wikipedia:

In informatica, un linguaggio di programmazione è detto di sostenere funzioni di prima classe (o funzione letterale) se considera le funzioni come oggetti di prima classe. Specificamente, ciò significa che la lingua supporta costruzione di nuove funzioni durante la esecuzione di un programma, la loro memorizzazione in strutture di dati, passandoli come argomenti ad altre funzioni e loro ritorno ai valori di altre funzioni.

Questa pagina anche illustrates splendidamente:

In realtà, proprio come qualsiasi altra variabile

  • Una funzione è un'istanza del tipo di oggetto
  • Una funzione può avere proprietà e ha un link al suo metodo di costruzione
  • Tu in grado di memorizzare la funzione in una variabile
  • È possibile passare alla funzione come parametro a un'altra funzione
  • È possibile restituire la funzione da una funzione

anche leggere il commento di TrayMan, interessante ...

+9

Citando wikipedia è carino e dandy, ma la descrizione è scritta in un linguaggio per gli scienziati e non per i geek. Cosa diavolo significa tutto ciò? L'ultima frase di questa citazione è vagu. – Spoike

+1

@Spoike, true ... fornito risorsa javascript. –

+14

Convenientemente un linguaggio con funzioni di prima classe ha anche funzioni di ordine superiore, anziché essere limitato alle funzioni di primo ordine, il che escluderebbe le funzioni di prima classe. (Anche se l'ordine superiore non è di prima classe.) – TrayMan

2

Significa che le funzioni sono oggetti, con un tipo e un comportamento. Possono essere costruiti dinamicamente, passati come qualsiasi altro oggetto e il fatto che possano essere chiamati fa parte della loro interfaccia.

2

Significa che la funzione eredita effettivamente da Object. In modo che tu possa passarlo e lavorarci come con qualsiasi altro oggetto.

In C# tuttavia è necessario astenersi da delegati o riflessioni per giocare con le funzioni. (questo è migliorato molto di recente con espressioni lambda)

0

Immagino che quando qualcosa è di prima classe in un linguaggio, significa che è supportato dalla sua sintassi piuttosto che da una libreria o da uno zucchero sintattico. per esempio, le classi in C non sono di prima classe

5

Test semplice. Se puoi farlo nella tua lingua (Python come esempio):

def double(x): 
    return x*x 

f = double 

print f(5) #prints 25 

La tua lingua sta trattando le funzioni come oggetti di prima classe.

+3

Ma posso farlo in C++: int due volte (int x) {return x << 1; } int (* f) (int) = due volte; std :: cout << (* f) (5) << std :: endl; Significa che le funzioni di C++ funzionano come oggetti di prima classe (con una sintassi divertente)? –

+1

Per poter creare una funzione all'interno di una funzione, voglio dire di no. – cHao

+1

I puntatori di funzioni C supportano (una definizione molto limitata di) funzioni di prima classe ma le funzioni non sono oggetti. I puntatori di funzione in C non contengono stato o comportamento. –

37

La nozione di "first-class functions" in un linguaggio di programmazione è stata introdotta dallo scienziato informatico britannico Christopher Strachey negli anni '60. La più famosa formulazione di questo principio è probabilmente in Structure and Interpretation of Computer Programs da Gerald Jay Sussman e Harry Abelson:

  • Possono essere nominato da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti come risultati delle procedure.
  • Possono essere inclusi nelle strutture dati.

Fondamentalmente, significa che è possibile eseguire con le funzioni tutto ciò che è possibile fare con tutti gli altri elementi nel linguaggio di programmazione. Quindi, nel caso di JavaScript, significa che tutto ciò che puoi fare con un Integer, una String, una Array o qualsiasi altro tipo di oggetto, puoi fare anche con le funzioni.

12

Approvazione più completa della formulazione di Strachey-Sussman-Abelson. Così, se il linguaggio supporta un tale costrutto poi hai una funzione come una prima classe lingua :)

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

In breve, tutto ciò è un oggetto di prima classe se agisce nella lingua come una sorta di manipolazione dello stato di oggetto o tipo di oggetto. Semplicemente qualcosa su cui puoi operare e passare le dichiarazioni e valutare contemporaneamente nelle espressioni. O anche più breve: quando si può pensare a una funzione come a un oggetto che può essere invocato ulteriormente.

+1

'alieni (come (donne));' bwahahahaha – agpt

8

Le funzioni JavaScript sono funzioni di prima classe che significano che funzioni e oggetti sono considerati la stessa cosa. Le funzioni possono essere memorizzate come variabili all'interno di un oggetto o di un array e possono essere passate come argomento o essere restituite da un'altra funzione. Ciò rende la funzione "cittadini di prima classe in JavaScript"

JavaScript utilizza la sintassi di notazione letterale che rende difficile comprendere appieno il fatto che in JavaScript le funzioni sono oggetti.

Per esempio ..

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

entrambi declerations sono equivalenti. Usando new chiamiamo la funzione di costruzione di un oggetto. Inoltre, utilizzando {} (collegamento JavaScript chiamato letterali) si chiama la funzione di costruzione di un oggetto. {} è solo una rappresentazione più breve per creare un'istanza del costruttore.

La maggior parte delle lingue utilizza new parola chiave per creare un oggetto, quindi consente di creare un oggetto JavaScript.

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

Come potete vedere abbiamo creato un nome di oggetto funzione.

Creazione della stessa funzione nome oggetto utilizzando l'espressione della funzione JavaScript.

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

Qui andiamo abbiamo appena creato una funzione nome oggetto.

7

In javascript le funzioni sono oggetti di prima classe perché possono fare molto più di quello che gli oggetti possono fare.

  • Una funzione è un'istanza di un tipo di oggetto.

Function instanceof Object //returns true

come un oggetto una funzione può avere proprietà e può avere un link ad esso è funzione di costruzione.

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

  • funzioni possono essere memorizzati in una variabile come valore.

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

  • funzioni possono essere passate come argomenti per altre funzioni

function callback (foo){ 
 
     foo(); 
 
} 
 

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

  • è possibile restituire una funzione da una funzione

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

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

  • possono essere memorizzati in una variabile come riferimento.

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

+0

Un oggetto può anche fare tutto questo. – Taurus

Problemi correlati