Mais e mais eu estou vendo funções sendo declaradas como
var foo = function() {
// things
};
Em vez de como eu aprendi, como
function foo() {
// things
}
Qual é a diferença? Melhor performance? Escopo? Devo estar usando esse método?
javascript
functions
Steve Robbins
fonte
fonte
Respostas:
var foo = function() {}
define uma variável que referencia uma função anônima.function foo() {}
define uma função nomeadafoo
.Qualquer um pode ser passado pelo nome como parâmetros de função e pode ser instanciado se o uso pretendido for para OOP.
No final do dia, qual você usa é amplamente determinado pelo seu caso de uso específico (o Javascript é divertido assim;)). Se você acabar usando o primeiro, sugiro fortemente que você nomeie a função:
var foo = function MY_function() {}
. Essa convenção de nomenclatura ajuda o callstack do depurador a não ser inútil.fonte
foo
e função é chamadaMY_function
expressão de função:
A expressão func neste caso é anônima, mas atribuída a um var para referência. Isso é diferente de uma instrução de função rotulada das seguintes maneiras:
new someFunction().constructor.name === 'someFunction';//false
As instâncias não obtêm o nome do var para constructor.name porque uma referência à função é atribuída ao var, mas o var, não a função, está vinculado ao nome do varEm uma instrução de função rotulada:
new someFunction().constructor.name === 'someFunction'; //true
o nome está vinculado diretamente à função.De um modo geral, não há realmente nenhuma grande razão para fazer expressão para var, a menos que você queira que as chamadas falhem se as coisas mudam ou você está definindo / atribuindo um método em uma linha. Na verdade, considero a elevação útil para organizar objetos com definições internas de função e método na parte inferior, para que eu possa entender o comportamento real do objeto e fazer definições de método público de uma linha (apenas atribuindo funcs ao
this.
mesmo nome), tudo em um local para facilitar a referência. Você deve sempre tentar usar instruções rotuladas para construtores, IMO, para poder identificar o 'tipo' de um objeto por meio de seu construtor.fonte
Seu primeiro exemplo é uma expressão, enquanto o segundo exemplo é uma declaração . A definição de funções como expressões permite mais flexibilidade no local em que a definição pode ocorrer, no que você pode atribuí-la, que pode ser transmitida como parâmetro, etc.
Por exemplo:
vs ...
Exemplos mais complexos se tornariam obcenamente complicados sem a sintaxe da expressão da função.
Veja /programming/111102/how-do-javascript-closures-work
fonte
A principal diferença prática é a elevação. Por exemplo:
vs
Além disso, esse é um comportamento indefinido
enquanto isso estiver ok.
fonte
if
instrução!