Declaraciones y expresiones de función en JavaScript | Nicolás Garzón
JavaScript permite crear funciones mediante declaraciones y expresiones . Ambas producen funciones, pero no se preparan ni se organizan de la misma manera.
JavaScript
Copiar function add ( first, second ) {
return first + second;
} JavaScript
Copiar const add = function ( first, second ) {
return first + second;
} ;
JavaScript
Copiar function calculateTotal ( price, quantity ) {
return price * quantity;
}
La palabra function.
Un nombre.
Parámetros.
Un cuerpo.
Las declaraciones se inicializan con la función durante la preparación del scope.
JavaScript
Copiar console. log ( calculateTotal ( 25 , 2 ) ) ;
function calculateTotal ( price, quantity ) {
return price * quantity;
} Por eso pueden llamarse antes de la línea donde aparecen.
Una expresión crea una función dentro de una expresión mayor, normalmente una asignación.
JavaScript
Copiar const calculateTotal = function ( price, quantity ) {
return price * quantity;
} ; La variable sigue las reglas de const, let o var.
JavaScript
Copiar calculateTotal ( 25 , 2 ) ;
const calculateTotal = function ( price, quantity ) {
return price * quantity;
} ; El binding está en la Temporal Dead Zone hasta llegar a la declaración.
JavaScript
Copiar const calculateTotal = function ( price, quantity ) {
return price * quantity;
} ; La función no tiene un nombre escrito después de function. Sin embargo, JavaScript puede inferir un nombre útil desde la variable.
JavaScript
Copiar console. log ( calculateTotal. name) ; JavaScript
Copiar const calculateTotal = function calculateOrderTotal ( price, quantity ) {
return price * quantity;
} ; El nombre interno puede ayudar en:
Stack traces.
Recursividad.
Depuración.
Fuera de la función, el nombre interno normalmente no está disponible.
JavaScript
Copiar console. log ( typeof calculateOrderTotal) ; Cada vez que se evalúa una expresión de función se crea un valor de función nuevo.
JavaScript
Copiar function createHandler ( ) {
return function ( ) {
console. log ( "Click" ) ;
} ;
}
const first = createHandler ( ) ;
const second = createHandler ( ) ;
console. log ( first === second) ; Aunque el código interno se vea igual, las dos llamadas producen funciones distintas.
Esto importa al registrar y eliminar listeners, comparar callbacks o memoizar valores.
Característica Declaración Expresión Ejemplo `function greet() {}` `const greet = function () {}` Disponible antes de la línea Sí Depende de la variable; normalmente no Nombre Obligatorio Puede ser anónima o nombrada Uso como parte de otra expresión No Sí
Una expresión resulta natural cuando la función solo se necesita en un lugar.
JavaScript
Copiar products. filter ( function ( product ) {
return product. isActive;
} ) ; Cuando la lógica tiene un significado reutilizable, un nombre separado puede ser más claro.
JavaScript
Copiar function isActiveProduct ( product ) {
return product. isActive;
}
products. filter ( isActiveProduct) ; Una Immediately Invoked Function Expression se crea y ejecuta de inmediato.
JavaScript
Copiar ( function ( ) {
const privateValue = 10 ;
console. log ( privateValue) ;
} ) ( ) ; Antes de los módulos modernos, las IIFE se utilizaban mucho para crear scopes privados y evitar variables globales.
Actualmente siguen siendo válidas, pero los módulos, los bloques y las funciones normales cubren muchos de esos casos con mayor claridad.
Una declaración suele ser clara para funciones principales o reutilizables.
JavaScript
Copiar function validateOrder ( order ) {
} Una expresión es útil cuando la función forma parte de una configuración, asignación o callback.
JavaScript
Copiar const strategies = {
standard : function calculateStandardPrice ( price ) {
return price;
} ,
} ; No existe una regla que obligue a usar una sola forma en todo el proyecto. La consistencia y la intención importan más que una preferencia absoluta.
JavaScript
Copiar function calculateBasePrice ( product, quantity ) {
return product. price * quantity;
}
const discountStrategies = {
none : function noDiscount ( total ) {
return total;
} ,
member : function memberDiscount ( total ) {
return total * 0.9 ;
} ,
} ;
function calculateFinalPrice ( product, quantity, strategy ) {
const total = calculateBasePrice ( product, quantity) ;
return discountStrategies[ strategy] ( total) ;
} La declaración representa una operación principal. Las expresiones forman parte de una tabla de comportamiento.
Pensar que todas las funciones pueden llamarse antes de su línea.
Confundir una expresión de función con una declaración.
Utilizar var y recibir undefined antes de la asignación.
Crear una función nueva en cada evaluación sin considerar su identidad.
Usar funciones anónimas extensas que ocultan la intención.
Depender del hoisting para organizar un archivo difícil de seguir.
Usar una IIFE cuando un bloque o módulo sería más claro.
Una declaración se inicializa con la función al preparar el scope.
Una expresión se evalúa cuando la ejecución llega a ella.
La variable que contiene una expresión determina su disponibilidad.
Las expresiones pueden ser anónimas o nombradas.
Cada evaluación de una expresión crea una función nueva.
Las declaraciones funcionan bien para operaciones principales.
Las expresiones encajan naturalmente dentro de asignaciones y configuraciones.
JavaScript
Copiar first ( ) ;
second ( ) ;
function first ( ) {
console. log ( "First" ) ;
}
const second = function ( ) {
console. log ( "Second" ) ;
} ; Respuesta first() funciona. second() lanza ReferenceError porque el binding second todavía está en la Temporal Dead Zone y la ejecución se detiene antes de llegar a su asignación.
Arrow functions presenta una sintaxis de función más compacta y, sobre todo, diferencias importantes en this, arguments y construcción.