Declaração de função
function foo () {}A função Foo será içada antes que todo o programa seja executado, por isso está disponível em todo o escopo (escopo) que define a função Foo. Mesmo chamando -o antes que a definição da função seja OK.
foo (); // Funciona porque Foo foi criado antes que este código runsfunction foo () {}Como pretendo escrever um artigo na introdução específica do escopo, não vou explicar em detalhes aqui.
Expressões de função
Para declarações de função, o nome da função é necessário, mas para expressões de função, é opcional. Portanto, expressões de função anônima e expressões de função nomeadas aparecem. do seguinte modo:
Declaração da função: functionName () {}
Declaração da função: função functionName [opcional] () {}
Então eu sei que, se não houver nome de função, deve ser uma expressão de função, mas como devemos julgar se houver um nome de função?
O JavaScript especifica que, se todo o corpo da função faz parte de uma expressão, é uma expressão de função, caso contrário, é uma declaração de função. O seguinte é a expressão:
var fuc = foo () {}Vamos dar alguns exemplos de expressão mais extremos:
! function foo () {} true && function foo () {}As afirmações acima são apenas para distinguir expressões de função e geralmente não são escritas assim. Em seguida, use um exemplo de comparação para ver o efeito:
foo1 (); // foo1 não está definido foo2 (); // funciona porque o foo2 foi criado antes que esse código seja executado! function foo1 () {alert ('foo1 works');}; function foo2 () {alert ('foo2 works');};Expressões de função anônima
var foo = function () {};O exemplo acima atribui uma função anônima à variável Foo.
foo; // 'Undefined'foo (); // Isso aumenta um tipo erorvar foo = function () {};Como o VAR é uma declaração, a variável Foo é houve (promovido) aqui; portanto, quando o programa é executado, a variável foo é chamada.
No entanto, como a declaração de atribuição só entra em vigor em tempo de execução, o valor da variável foo é indefinido.
Expressões de função nomeadas
Outra coisa a falar é a atribuição de funções nomeadas.
var foo = barra de função () {bar (); // trabalha}; bar (); // ReferenceErrorAqui, a barra de função nomeada é atribuída à variável Foo, por isso é invisível fora da declaração de função, mas ainda pode ser chamada dentro da função da barra. Isso ocorre porque o mecanismo de JavaScript para nomear funções, o nome da função é sempre válido no escopo dentro da função.