Definir una función se refiere al binding de la misma, es decir a que valor es parecida. Definir las expresiones con las que cuenta.

// keyword function para definir que es uan funcion
// los parametros puede ser uno o varios o ninguno, y pueden ser de cualquier tipo
// {} definen el inicio y fin del contenido de la funcion
// return define el valor de regreso de la funcion, que 
// square esta haciendo binding sobre la funcion, es decir que apunta hacia ella
let square = function(params) {
	return params * params
}

// cada vez que ejecutamos square estamos ejecutando haciendo una instancia de esa funcion 
// let y const solo tienen block scope, pero var tiene global
// como se esta haciendo un binding es facilmente cambiable el valor de square por otra cosa
square = function(params) {
	return null
}

Básicos de funciones

Pedazos de código re-utilizables, diferentes formas

var user = 'Adrian', age = 28

//Las variables creadas dentro de la funcion desaparecen al acabar.
//Las variables que se pueden utilizar en las funciones tienen alcanse 
//... hasta el elemento padre.

//Declaración, podemos o no pasarle los parametros.
function imprimirEdad(nombre,edad){
	console.log(`${nombre} tiene ${edad} años`)
}

//Implementación.
imprimirEdad(user,age)

Arrow function

var usuario1 = { nombre: 'Adrián', apellido: 'Garcia', edad: 25 }
const MAYORIA_DE_EDAD = 18;

//Arrow function mas simplificada y anonima(porque no tiene nombre)
//... que llama a otra arrow function
//... si la arrow function es solo un renglon de return se puede compactar
const esMayor = ({ edad })=> edad <= MAYORIA_DE_EDAD

const imprimir = persona => {
	if (esMayor(persona){
		console.log(`${persona.nombre} si es mayor de edad`)
	} else {
		console.log(`${persona.nombre} no es mayor de edad`)
	}
}

imprimir(usuario1)

//Arrow function mas simplificada y anonima(porque no tiene nombre)
//... se pueden quitar los parentesis si es solo un atributo
const imprimir = persona => {
	if (persona.edad >= MAYORIA_DE_EDAD){
		console.log(`${persona.nombre} si es mayor de edad`)
	} else {
		console.log(`${persona.nombre} no es mayor de edad`)
	}
}

//Arrow function
const imprimir = function imprimir(persona) => {
	if (persona.edad >= MAYORIA_DE_EDAD){
		console.log(`${persona.nombre} si es mayor de edad`)
	} else {
		console.log(`${persona.nombre} no es mayor de edad`)
	}
}

//Funcion normal
function imprimir (persona) {
	if (persona.edad >= MAYORIA_DE_EDAD){
		console.log(`${persona.nombre} si es mayor de edad`)
	} else {
		console.log(`${persona.nombre} no es mayor de edad`)
	}

Alcance de las variables creadas en una función

var user = 'Adrian', age = 28

function imprimirEdad(nombre,edad){
	console.log(`${nombre} tiene ${edad} años`)
}

imprimirEdad(user,age)

//Si intentamos acceder a las variables nombre o edad nos manda error,
//... puesto que solo existend dentro de la funcion imprimirEdad().
console.log(nombre)
console.log(edad)

Al usar el mismo nombre de la variable

var user = 'Adrian', age = 28

function imprimirEdad(nombre,edad){
	console.log(`${nombre} tiene ${edad} años`)
}

imprimirEdad(user,age)

//Si intentamos acceder a las variables nombre o edad nos manda error,
//... puesto que solo existend dentro de la funcion imprimirEdad().
console.log(nombre)
console.log(edad)