Uma declaração é uma instrução de função nomeada; uma expressão atribui uma função a uma variável. A diferença prática é hoisting.
js
// Declaration — fully hoisted, callable before its line
declared(); // ✅ works
function declared() { return "hi"; }
// Expression — only the variable binding is hoisted, not the function
expressed(); // ❌ TypeError: expressed is not a function
var expressed = function () { return "hi"; };
Por que isso importa
Declarações de função são hoistadas com seu corpo, então a função inteira existe antes da execução chegar até ela. Uma expressão de função é apenas um valor atribuído a uma variável — no ponto da chamada inicial, expressed ainda é undefined (com var) ou está na TDZ (com let/const).
Quando usar qual
js
// expression — for callbacks, conditional definitions, arrow functions
const handler = () => doThing();
const fn = condition ? a : b;
arr.map(x => x * 2);
// declaration — clear, hoisted top-level functions
function calculateTotal(items) { ... }
Declarações leem bem para funções nomeadas de nível superior e se beneficiam de hoisting (você pode defini-las após seu uso). Expressões são necessárias para funções arrow, callbacks, IIFEs e atribuição condicional de funções. Funções arrow são sempre expressões.
