2012/6/20 André Caribé <
decoc...@gmail.com>:
É por aí, André. Infelizmente existem muitos mitos e confusões ligadas
ao tema das funções em JavaScript.
A questão não tem nada a ver com o fato de a função ser anônima ou ter
nome, e sim com a forma de sua declaração, se ela é declarada com a
instrução function (function statement) ou na forma de uma expressão
função. Acontece que muitas pessoas confundem "função anônima" com
"expressão função".
Veja estes exemplos:
(function bloco () {
function f (arg) {
console.log(arg);
};
var g = function (arg) {
console.log(arg);
};
var h = function hugo (arg) {
console.log(arg);
};
});
f('bla');
A função f foi declarada em uma instrução function. Essa instrução
"iça" a função para o escopo global (em inglês: içar == hoist), e ela
pode ser acessada fora do bloco, como vemos na última linha.
As funções g e h foram declarada em expressões. Nestes casos não
acontece o içamento (hoisting) e as funções g e h só podem ser
acessada no escopo local da função bloco. Note que a função h não é
uma função anônima, ela se chama hugo (isso é útil para depuração;
especialmente se a função chamada hugo for vinculada a uma variável de
mesmo nome ;-).
Finalmente, a função bloco é uma função com nome (ela se chama bloco)
mas foi definida em uma expressão (este é o motivo de usar parêntesis
em torno da definição da função; sem os parêntesis seria uma instrução
function).
Resumindo, o içamento para o escopo global acontece sempre que a
função é definida em uma instrução function, e nunca quando ela é
definida em uma expressão, independente de ser ou não uma função
anônima. É por causa dessa confusão com a instrução function que o
Douglas Crockford recomenda nunca usar esta forma, mas sempre definir
funções em expressões.