Qual é a vantagem de atribuir uma função a um var?

10

Dado este exemplo de Javascript, encontrei

var sum = function() {
  var i, sum = 0;
  for(i = 0; i < arguments.length; i += 1) {
    sum += arguments[i];
  }
  return sum;
};

Qual a vantagem de atribuir uma função a um var?

octopusgrabbus
fonte
stackoverflow.com/questions/336859
BlueRaja - Danny Pflughoeft

Respostas:

8

A resposta curta, acredito, é simplesmente que você está criando uma função anônima atribuída a uma variável, em vez de criar uma função nomeada com ...

    function sum() {}

Uma boa maneira de verificar as diferenças é chamar .ToString () nelas e ver a diferença, ou você pode fazer o console.log (sum.name). Um dará um nome real e o outro nada, ou seja, a função anônima (aquela atribuída à var). Também há detalhes específicos, como a var sum = function () {} é definida no tempo de execução e a função sum () {} é definida no tempo de análise.

harmonickey
fonte
O que quero dizer com a última frase é que, se você tentasse chamar sum () em uma linha anterior acima de onde foi definida por var, haveria um erro. Se estiver definido como na minha resposta, não haverá erro, mesmo que a chamada esteja acima da função.
Harmonickey
12
Isso explica a diferença , mas acho que não explica a vantagem .
21412 Keith Thompson
qual é a diferença entre tempo de análise e tempo de execução?
Wern Ancheta
11
Não tem nada a ver com funções nomeadas, você ainda pode atribuir uma função chamada para uma variável
Juan Mendes
5

Uma vantagem é que você não pode usar uma declaração de função em um bloco. Eles podem estar apenas no nível superior de um arquivo ou diretamente dentro de outra função.

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Tudo isso não é especificado pelo padrão e os navegadores fazem coisas diferentes, consulte /programming/10069204/function-declarations-inside-if-else-statements . Portanto, se você precisar usar o outro estilo algumas vezes, para obter consistência, sempre

Além disso, não tenho certeza disso, mas se bem me lembro, alguns minificadores antigos não eram inteligentes o suficiente para lidar com declarações de função e não renomeá-las.

Austin
fonte
3

Eu não sou um especialista em Javascript, então leve isso com um pouco de sal. Eu acho que em alguns casos as pessoas podem fazer isso por estilo e a mesma coisa pode ser alcançada simplesmente escrevendo "function sum () {...}"

No entanto, atribuir uma função a uma variável é uma técnica muito poderosa em programação funcional. Se você está familiarizado com OOP, é um pouco semelhante ao polimorfismo. Pense no exemplo clássico da classe base Animal e das classes derivadas de Gato / Cão. Você pode escrever um código que funcione com o Animal, mas quando ele chama uma função, essa função pode fazer um trabalho diferente dependendo do tipo de uma instância.

Na programação funcional, você pode ter um algoritmo que funcione com "uma função", mas se estiver usando uma variável para chamar essa função, terá a flexibilidade de atribuir uma função diferente em tempo de execução.

Por exemplo, digamos que você escreva um algoritmo para apresentar 10.000 pontos de dados em uma janela com apenas 500 pixels de largura. Cada pixel representará 20 pontos de dados e, para apresentá-los, você precisará agregar esses 20 pontos em um único valor.

Então, digamos que você defina um algoritmo para apresentar os 10.000 pontos e esse algoritmo usa uma variável de função chamada agregada da seguinte forma:

...
displayValue = aggregate( numbersInOnePixel );
...

Agora, em tempo de execução, o usuário pode selecionar como os dados serão agregados. Sua variável de função real pode ser qualquer um dos seguintes:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
DXM
fonte
0

É principalmente uma questão de estilo, já que as únicas situações em que a diferença aparece (chamando algumas das funções antes de terminar todas as declarações; usando o método toString) são tipos de casos de canto, na minha opinião.

Um dos argumentos que ouvi apoiando esse var =estilo é que ele é consistente com a maneira como você declara variáveis ​​normais. Isso limita o número de recursos de idioma que você usa e simplifica a introdução do seu programa para alguém novo em Javascript.

hugomg
fonte