Javascript – Diferença entre as funções var name = function() e function name()?

Javascript – Diferença entre as funções var name = function() e function name()?

25 de setembro de 2017 0 Por Ramos de Souza Janones

Declaração de Função: function name()

Uma declaração de função define uma variável de função sem a necessidade de atribuição de variável. São constructs independentes, e não podem ser aninhados em blocos que não sejam de função (ver comentário mais abaixo). Seria como um “parente” das declarações de variável. Assim como variáveis precisam ser declaradas com var, funções são declaradas com function.

function bar() {
   return 3;
}

bar() //3
bar  //function

 

Expressão de Função: var name = function()

Aprenda React do Zero ao ProfissionalUma expressão de função define uma função como parte de uma expressão sintática maior, geralmente uma atribuição de variável. Funções definidas com expressões de função podem ter nome ou serem anônimas. Não podem iniciar por function, por isso os parênteses são usados na “auto invocação” no exemplo abaixo:

//expressão anônima de função
var a = function() {
   return 3;
}

//expressão nominada de função
var a = function bar() {
   return 3;
}

//expressão "autoinvocada" de função
(function digaOi() {
    alert("Oi!");
})();

 

LEIA TAMBÉM:  Facebook altera a licença do React para MIT

Exemplo de visibilidade de escopo:

<script>
  funcaoUm(); // Da erro, ainda nao foi definida
  var funcaoUm = function() { }
</script>

<script>
  var funcaoDois = function banana() {
    banana(); // Nao da erro, está no escopo
  }
  banana(); // Da erro, está fora do escopo (exceto no IE)
</script>

<script>
  funcaoTres(); // Nao da erro, é resolvida ao compilar
  function funcaoTres() { }
</script>

 

“Funções não podem ser declaradas em blocos que não sejam de código”

Vejamos este código:

if (true) {
  function foo() {
    return 'primeiro';
  }
} else {
  function foo() {
    return 'segundo';
  }
}
foo();

 

Alguns browsers vão retornar “primeiro”, outros “segundo”!

De acordo com a especificação, declarações de função até podem aparecer dentro de blocos de função, mas não dentro de blocos de ifwhilefor e outros blocos estruturais.

Nestes casos, o que deveria ocorrer é um syntax error, porém praticamente nenhuma das implementações faz isso na prática, e o que é pior, cada uma trata códigos como o do exemplo de uma maneira diferente (com exceção de BESEB e DMDScripot, conforme esta fonte).

Ramos de Souza Janones

Janones, é um empreendedor brasileiro apaixonado por empreendedorismo e tecnologia. Ao longo dos anos trabalhando com o desenvolvimento de softwares desktop desde a linguagem Clipper, passando pelo Delphi e atualmente com Java.

Optou pela formação de Publicidade e Marketing por sua segunda empresa de tecnologia ter participado do "boom" da internet nos anos 90 e na procura de melhorar seus conhecimentos em negócios.

Em razão da principal formação e profundos conhecimentos em programação e banco de dados, é capaz de realizar o desenvolvimento de aplicativos web, desktop e mobile com maior criatividade e inovação que profissionais de desenvolvimento com uma formação única e mais especifica, dedicada somente ao desenvolvimento de softwares.

Com toda sua experiência com empresas de software, sua formação e paixão por negócios escreveu o livro "Marketing para Empresas e Profissionais de Software", publicado pela editora carioca Ciência Moderna em 2012. Além de outros livros sobre programação.