2009-04-01 24 views
115

En un recent question, recibí sugerencias para hablar sobre, entre otras cosas, el aspecto de JavaScript donde las funciones son objetos de "primera clase". ¿Qué significa la "primera clase" en este contexto, a diferencia de otros objetos?¿Qué se entiende por 'objeto de primera clase'?

EDITAR (Jörg W Mittag): duplicado exacto: "What is a first class programming construct?"

+1

posible duplicado de [¿Qué es una programación de primera clase construir?] (Http://stackoverflow.com/questions/646794/what-is-a-first-class- programación-construcción) –

Respuesta

144

Para citar Wikipedia:

En informática, un lenguaje de programación se dice que apoyar funciones de primera clase (o función literal) si trata las funciones como objetos de primera clase. En concreto, esto significa que el lenguaje soporta la construcción de nuevas funciones durante la ejecución de un programa , almacenándolos en estructuras de datos, pasando como argumentos a otras funciones, y que regresan como los valores de otras funciones .

Esta página también illustrates maravillosamente:

En realidad, al igual que cualquier otra variable

  • Una función es una instancia del tipo de objeto
  • Una función puede tener propiedades y tiene un enlace a su método de constructor
  • Usted puede almacenar la función en una variable
  • Usted puede pasar a la función como un parámetro a otra función
  • Puede volver a la función desde una función

también leer el comentario de TrayMan, interesante ...

+9

Citar wikipedia es agradable y elegante, pero la descripción está escrita en un lenguaje para científicos y no para geeks. ¿Qué diablos significa todo eso de todos modos? La última oración en esa cita es vagu. – Spoike

+1

@Spoike, true ... proporcionado un recurso de javascript. –

+14

Convenientemente, un lenguaje que tiene funciones de primera clase también tiene funciones de orden superior, en lugar de limitarse a funciones de primer orden, lo que descartaría funciones de primera clase. (Aunque es posible un orden superior, no de primera clase.) – TrayMan

2

Significa que las funciones son objetos, con un tipo y un comportamiento. Se pueden construir dinámicamente, pasar como cualquier otro objeto, y el hecho de que se pueden llamar es parte de su interfaz.

2

Significa que la función realmente hereda de Object. Para que pueda pasarlo y trabajar con él como con cualquier otro objeto.

En C# sin embargo, debe abstenerse de delegados o reflexión para jugar con las funciones. (esto ha mejorado mucho recientemente con expresiones lambda)

0

Supongo que cuando algo es de primera clase en un idioma, significa que es compatible con su sintaxis en lugar de una biblioteca o azúcar sintáctico. por ejemplo, las clases en C no son de primera clase

5

Prueba simple. Si puede hacerlo en su idioma (Python como ejemplo):

def double(x): 
    return x*x 

f = double 

print f(5) #prints 25 

Su idioma trata las funciones como objetos de primera clase.

+3

Pero puedo hacer esto en C++: int dos veces (int x) {return x << 1; } int (* f) (int) = dos veces; std :: cout << (* f) (5) << std :: endl; ¿Eso significa que C++ trata las funciones como objetos de primera clase (con una sintaxis divertida)? –

+1

Hasta que pueda crear una función dentro de una función, quiero decir que no. – cHao

+1

Los punteros de función C admiten (una definición muy limitada de) funciones de primera clase, pero las funciones no son objetos. Los punteros de función en C no contienen estado o comportamiento. –

37

La noción de "first-class functions" en un lenguaje de programación fue introducida por el informático británico Christopher Strachey en la década de 1960. La formulación más famosa de este principio es, probablemente, en Structure and Interpretation of Computer Programs por Gerald Jay Sussman y Harry Abelson:

  • Se pueden mencionar por variables.
  • Se pueden pasar como argumentos para los procedimientos.
  • Se pueden devolver como resultado de los procedimientos.
  • Se pueden incluir en las estructuras de datos.

Básicamente, significa que puede hacer con las funciones todo lo que puede hacer con todos los demás elementos en el lenguaje de programación. Entonces, en el caso de JavaScript, significa que todo lo que puede hacer con un Entero, una Cadena, una Matriz o cualquier otro tipo de Objeto, también puede hacer con las funciones.

12

Aprobación más completa de la formulación de Strachey-Sussman-Abelson. Así que si su idioma es compatible con una construcción de este tipo entonces usted tiene una función como de primera clase idioma :)

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 resumen, cualquier cosa es un objeto de primera clase si actúa en el idioma como un tipo de objeto de manipulación de estado o tipo de objeto. Simplemente algo que puede operar y pasar declaraciones y evaluar en expresiones al mismo tiempo. O incluso más corto: cuando puede pensar en una función como un objeto que puede invocarse adicionalmente.

+1

'aliens (like (women));' bwahahahaha – agpt

8

Las funciones de JavaScript son funciones de primera clase, lo que significa que las funciones y los objetos se tratan como la misma cosa. Las funciones se pueden almacenar como una variable dentro de un objeto o una matriz, así como también se pueden pasar como un argumento o ser devueltas por otra función. Eso hace que la función "ciudadanos de primera clase en JavaScript"

JavaScript usa sintaxis de notación literal, lo que hace que sea difícil comprender por completo el hecho de que las funciones de JavaScript son objetos.

Por ejemplo ..

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

ambos declerations son equivalentes. Al usar new estamos llamando a la función constructora de un Objeto. También mediante el uso de {} (atajo de JavaScript llamado literales) estamos llamando a la función de construcción de un Objeto. {} es solo una representación más corta para crear instancias del constructor.

La mayoría de los lenguajes usa new palabra clave para crear un objeto, así que permite crear un objeto JavaScript.

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

Como se puede ver que creó un nombre de objeto función.

Creando la misma función de nombre de objeto usando la expresión de función de JavaScript.

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

Aquí vamos acabamos de crear una función de nombre de objeto.

7

En javascript las funciones son objetos de primera clase porque pueden hacer mucho más de lo que los objetos pueden hacer.

  • Una función es una instancia de un tipo de objeto.

Function instanceof Object //returns true

como un objeto una función puede tener propiedades y puede tener un enlace de vuelta a su función constructora.

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

  • Las funciones pueden ser almacenados en una variable como un valor.

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

  • Funciones se pueden pasar como argumentos para otras funciones

function callback (foo){ 
 
     foo(); 
 
} 
 

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

  • Puede devolver una función a partir de una función

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

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

  • Puede ser almacenado en una variable como referencia.

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

+0

Un objeto puede hacer todo eso también. – Taurus

Cuestiones relacionadas