Objeto Function ECMAScript (clase)
- Página anterior Objeto arguments
- Página siguiente Cierre (closure)
Las funciones de ECMAScript son objetos completamente funcionales.
Objeto (clase) Function
Lo más interesante de ECMAScript puede ser que las funciones son objetos completamente funcionales.
La clase Function puede representar cualquier función definida por el desarrollador.
La sintaxis para crear una función directamente utilizando la clase Function es la siguiente:
var function_name = new function()arg1, arg2, ... , argN, function_body)
En la forma anterior, cada arg Todos tienen un solo parámetro, el último parámetro es el cuerpo de la función (el código que se debe ejecutar). Estos parámetros deben ser cadenas.
Recuerda esta función?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
También se puede definir de la siguiente manera:
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage)");
Aunque es algo difícil de escribir debido a las cadenas, esto ayuda a entender que las funciones son solo un tipo de referencia, y su comportamiento es el mismo que el de las funciones creadas explícitamente con Function.
Por favor, vea el siguiente ejemplo:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //Se muestra "20"
Como ya sabes, la segunda función sobrecarga la primera función, haciendo que doAdd(10) muestre "20" en lugar de "30".
Si se reescribe este bloque de código de la siguiente manera, el concepto se hace más claro:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Por favor, observe este código, claramente, el valor de doAdd se ha cambiado para que apunte a un puntero a un objeto diferente. El nombre de la función solo es una referencia al valor del objeto de la función, actuando como otros objetos. Incluso se puede hacer que dos variables apunten a la misma función:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //Se muestra "20" alsodoAdd(10); //Se muestra "20"
Aquí, la variable doAdd se define como una función, y luego alsodoAdd se declara como un puntero que apunta a la misma función. Ambos variables pueden ejecutar el código de la función y generar el mismo resultado: "20". Por lo tanto, ¿se puede pasar una función como parámetro a otra función si el nombre de la función solo es una referencia a la función? La respuesta es afirmativa!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //Muestra "20"
En el ejemplo anterior, callAnotherFunc() tiene dos parámetros - la función a llamar y los parámetros que se pasan a la función. Este código pasa doAdd() a la función callAnotherFunc(), el parámetro es 10, y muestra "20".
Nota:A pesar de que se puede usar el constructor Function para crear funciones, no es recomendable hacerlo, ya que definir una función con él es mucho más lento que hacerlo de manera tradicional. Sin embargo, todos los funciones deben considerarse instancias de la clase Function.
La propiedad length del objeto Function
Como se mencionó anteriormente, las funciones son de tipo de referencia, por lo que también tienen propiedades y métodos.
La propiedad length definida por ECMAScript declara la cantidad de parámetros esperados por la función. Por ejemplo:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //Muestra "1" alert(sayHi.length); //Muestra "0"
La función doAdd() define un parámetro, por lo que su length es 1; sayHi() no define parámetros, por lo que su length es 0.
Recuerde, independientemente de cuántos parámetros se definan, ECMAScript puede aceptar una cantidad ilimitada de parámetros (máximo 25), esto se explicó en el capítulo "Resumen de funciones". La propiedad length solo proporciona una manera sencilla de ver la cantidad de parámetros esperados por defecto.
Métodos del objeto Function
El objeto Function también tiene métodos compartidos con todos los objetos, como valueOf() y toString(). Ambos métodos retornan el código fuente de la función, lo que es especialmente útil en la depuración. Por ejemplo:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
El siguiente código de arriba muestra el texto de la función doAdd().Pruebe usted mismo¡!
- Página anterior Objeto arguments
- Página siguiente Cierre (closure)