Funções e Hoisting

nandobfr

Fernando Junior

Posted on March 18, 2021

Funções e Hoisting

Chegamos a mais um post da minha saga de estudos em JavaScript.

No post de hoje irei falar sobre funções.

Funções

Funções são um dos principais conceitos fundamentais em qualquer linguagem de programação e fazem parte do tipo de dado object.

O principal objetivo das funções é permitir que o desenvolvedor crie um bloco de código dentro da função uma única vez, e a utilize quantas vezes forem necessárias, quando e onde quiser.

Vale ressaltar que o ato de usar uma função, pode receber alguns nomes, mas terão o mesmo significado, podemos invocar um função, ou chamar a função.

Existem duas formas de declarar uma função, são conhecidas como: Function Declaration e Function Expression.

Function Declaration

Para declararmos usaremos a seguinte sintaxe:

  • Palavra chave function
  • Nome da função
  • Abertura e fechamento de parênteses ()
  • Abertura e fechamento do bloco que irá conter o código que será executado quando a função for invocada {}
function sayHi () {
  console.log('Hi!')
}
Enter fullscreen mode Exit fullscreen mode

Acima criamos a função, que somente nos retorna impresso no console a string Hi!, agora no exemplo abaixo, iremos invocar a função, ou seja, iremos executa-la.

sayHi() // Hi!
Enter fullscreen mode Exit fullscreen mode

Function Expression

Para declararmos usaremos a seguinte sintaxe:

  • Criaremos um variável ou constante
  • Atribuiremos a ela a palavra reservada function
  • Abertura e fechamento de parênteses ()
  • Abertura e fechamento do bloco que irá conter o código que será executado quando a função for invocada {}
const sayHello = function () {
  console.log('Hello!')
}
Enter fullscreen mode Exit fullscreen mode

A invocação se dá da mesma forma que utilizamos na função criada no exemplo de function declaration.

sayHello() // Hello!
Enter fullscreen mode Exit fullscreen mode

Hoisting

Diante dos exemplos apresentados acima, não existem muitas diferenças entre os dois tipos de criação de funções.

Mas existe um detalhe importante, que faz muita diferença, que chamamos de hoisting.

Hoisting, pode ser traduzido como içamento, que é o mesmo que puxar para cima.

Então, quando criamos uma função da forma function declaration, se esta função estiver em qualquer lugar do código, que não seja no topo da página, o JavaScript por baixo dos panos puxa sua função para o topo do arquivo.

Com isso, se uma function declaration for criada depois de ela ser invocada, não ocorrerá nenhum problema de execução.

sayHi() // Hi!

function sayHi () {
  console.log('Hi!')
}
Enter fullscreen mode Exit fullscreen mode

Já nas funções criadas com function expression, isso não acontece. Se uma function expression for invocada acima de sua criação, retornará um erro de execução, e se for invocada após a criação, será executada normalmente.

sayHello() // Cannot access 'sayHello' before initialization

const sayHello = function () {
  console.log('Hello!')
}

sayHello() // Hello!
Enter fullscreen mode Exit fullscreen mode

Argumentos, Parâmetros e Parâmetros Default

Muitas vezes iremos querer passar valores para dentro de nossas funções, para que algo seja feito com eles.

Abaixo irei criar uma função, onde irei passar dois valores para ela, esses valores devem ser interpretados como variáveis locais, que só poderão ser usados, acessados de dentro da função. Essas valores que são passados na criação da função, recebem o nome de parâmetros.

const fullName = function (name, lastName) {
  console.log(`Oi, ${name} ${lastName}`)
}
Enter fullscreen mode Exit fullscreen mode

Na hora de invocarmos essa função, devemos passar os valores esperados por ela. No caso ela espera receber dois valores, e esses valores são chamados de argumentos.

fullName('Tom', 'Hanks') // Oi, Tom Hanks
Enter fullscreen mode Exit fullscreen mode

Importante frisar que a ordem dos argumentos passados, deve corresponder a ordem dos parâmetros, ou seja, o primeiro argumento será atribuído ao primeiro parâmetro, e assim por diante.

fullName('Hanks', 'Tom') // Oi, Hanks Tom
Enter fullscreen mode Exit fullscreen mode

Se na execução de um função que espera receber algum valor, esse valor (argumento) não for passado, o JavaScript irá injetar o valor undefined automaticamente.

fullName() // undefined undefined
Enter fullscreen mode Exit fullscreen mode

Para evitarmos este tipo de comportamento, existe a possibilidade de passarmos um valor inicial na criação da função, que chamamos de parâmetro default.

No exemplo abaixo, irei criar a função chamada myFavoriteFood passando um parâmetro default para o parâmetro food.

Se na sua invocação, o argumento não for passado, o valor informado como parâmetro default, será atribuído automaticamente e se o valor for passado por argumento, ele irá sobrescrever o parâmetro default.

const myFavoriteFood = function (food = 'Pizza') {
 console.log(`Minha comida favorita é: ${food}.`)
}

myFavoriteFood() // Minha comida favorita é: Pizza.
myFavoriteFood('Macarrão') // Minha comida favorita é: Macarrão.
Enter fullscreen mode Exit fullscreen mode

Retornando Valores

Até o momento, nos exemplos acima, somente exemplifiquei funções que exibem algum valor no console, mas nem sempre iremos usar as funções desta forma.

Existirão casos em que iremos querer que a função retorne algum valor para a gente.

Abaixo irei criar uma função que espera receber como parâmetro um number, a função irá pegar o valor passado por argumento na invocação da função e irá retornar esse valor multiplicado por dois.

Esse retorno será informado dentro da função com o uso da palavra chave return.

const double = function (number) {
  return number * 2
}

const result = double(3)
console.log(result) // 6

const showResult = function (value) {
 return `O valor é: ${value}`
}

console.log(showResult(result)) // O valor é: 6
Enter fullscreen mode Exit fullscreen mode

Portanto, é desta forma que fazemos uma função retornar um valor, para que possamos usa-lo fora da função.

Arrow Function

Esta é uma adição do JavaScript moderno, chegou a linguagem junto com o ECMAScript 6 (ES6).

As arrow functions tornam a criação de funções mais curta e concisa.

Abaixo irei criar uma função na sintaxe function expression e irei replicar esta função utilizando a sintaxe de arrow function.

// Function Expression

const myTeam = function (team) {
 console.log(`Meu time é: ${team}.`)
}

myTeam('Madureira') // Meu time é: Madureira.

// Arrow Function

const myTeam = (team) => {
 console.log(`Meu time é: ${team}`)
}

myTeam('Olaria') // Meu time é: Olaria.
Enter fullscreen mode Exit fullscreen mode

A arrow function pode ser ainda mais simplificada, quando escrevemos uma função que tem apenas um parâmetro, podemos remover os parênteses ().

const myTeam = team => {
 console.log(`Meu time é: ${team}`)
}

myTeam('Olaria') // Meu time é: Olaria.
Enter fullscreen mode Exit fullscreen mode

Obs: A remoção dos parênteses é opcional, mas tenha em mente que caso o parâmetro possua um valor default ou sua função não possua parâmetros, os parênteses devem ser mantidos, caso contrário, sua função não irá funcionar.

Outra possibilidade de encurtamento da escrita de uma arrow function, é caso o bloco de código dentro da função retorne apenas uma linha, um valor, nesses casos podemos deixar toda a função em uma única linha.

const myName = name => console.log(name)

myName('Fernando') // Fernando

const double = number => number * 2

console.log(double(3)) // 6

// Sem parâmetro

const myWord = () => console.log('MyWord')

myWord() // MyWord

// Com default parâmetro

const myTeam = (team = 'Botafogo') => console.log(`Meu time é: ${team}`)

myTeam() // Meu time é: Botafogo
myTeam('Juventude') // Meu time é: Juventude
Enter fullscreen mode Exit fullscreen mode

Funções Vs Métodos

Métodos também são funções, mas são funções que estão associadas a outros tipos de dados, como strings por exemplo, já as funções são criadas sem associação alguma.

O que diferencia um método de uma função é a forma como a gente invoca e aonde é declarado.

Funções

Para invocarmos uma função, basta chamarmos ela e ao término do nome realizar a abertura e fechamento de parênteses ().

const sayHi = () => 'Hi!'

const greet = sayHi()

console.log(greet) // Hi!
Enter fullscreen mode Exit fullscreen mode
Métodos

Para invocarmos um método, devemos utilizar a anotação de ponto ., como exemplo, abaixo usarei o método de strings toUpperCase(), que transforma as letras das strings para maiúsculas.

const name = 'Escobar'

const nameInUpperCase = name.toUpperCase()

console.log(nameInUpperCase) // ESCOBAR
Enter fullscreen mode Exit fullscreen mode

Vou deixar o link para a documentação da MDN sobre funções


Esse foi mais um post da minha saga de estudos em JavaScript Vanilla. Espero que estejam gostando!

Qualquer dúvida ou sugestão, vocês me encontram nas minhas redes sociais:

LinkedIn
GIthub
Twitter

💖 💪 🙅 🚩
nandobfr
Fernando Junior

Posted on March 18, 2021

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related