Recebi um pedaço de código para javascript que simplesmente não entendo:
function dmy(d) {
function pad2(n) {
return (n < 10) ? '0' + n : n;
}
return pad2(d.getUTCDate()) + '/' +
pad2(d.getUTCMonth() + 1) + '/' +
d.getUTCFullYear();
}
function outerFunc(base) {
var punc = "!";
//inner function
function returnString(ext) {
return base + ext + punc;
}
return returnString;
}
Como uma função pode ser definida dentro de outra função? Podemos chamar pad2 () de fora da minha função ()?
Por favor, coloque alguma luz sobre isso. obrigado
javascript
nested-function
Thomas
fonte
fonte
Respostas:
Funções são outro tipo de variável em JavaScript (com algumas nuances, é claro). Criar uma função dentro de outra função muda o escopo da função da mesma forma que mudaria o escopo de uma variável. Isso é especialmente importante para uso com encerramentos para reduzir a poluição total do namespace global.
As funções definidas em outra função não estarão acessíveis fora da função, a menos que tenham sido anexadas a um objeto acessível fora da função:
Neste exemplo, a função baz estará disponível para uso depois que a
foo
função for executada, uma vez que é substituídawindow.baz
. A função bar não estará disponível para qualquer contexto diferente dos escopos contidos nafoo
função.como um exemplo diferente:
A
Fizz
função é projetada como um construtor para que, quando executada, atribua umabuzz
função ao objeto recém-criado.fonte
É chamado de fechamento .
Basicamente, a função definida em outra função está acessível apenas dentro desta função. Mas pode ser passado como resultado e esse resultado pode ser chamado.
É um recurso muito poderoso. Você pode ver mais explicações aqui:
javascript_closures_for_dummies.html espelho em Archive.org
fonte
é equivalente (ou muito semelhante) a
a menos que eu esteja enganado.
Portanto, não há nada de engraçado acontecendo.
fonte
A instanciação de funções é permitida dentro e fora das funções. Dentro dessas funções, assim como as variáveis, as funções aninhadas são locais e, portanto, não podem ser obtidas do escopo externo.
foo
manipulabar
dentro de si.bar
não pode ser tocado a partir do escopo externo, a menos que seja definido no escopo externo.Então, isso não vai funcionar:
fonte
Quando você declara uma função dentro de uma função, as funções internas estão disponíveis apenas no escopo em que foram declaradas ou, no seu caso,
pad2
só podem ser chamadas nodmy
escopo.Todas as variáveis existentes em
dmy
são visíveis empad2
, mas não acontece o contrário: Dfonte
É perfeitamente normal em Javascript (e em muitas linguagens) ter funções dentro de funções.
Reserve um tempo para aprender o idioma, não o use porque é semelhante ao que você já conhece. Eu sugiro assistir a série de apresentações YUI de Douglas Crockford em Javascript, com foco especial no Ato III: Funcionalizar o Ultimate (link para download de vídeo, slides e transcrição)
fonte
Irá gerar um erro. Uma vez que
bar
está definido dentrofoo
,bar
só estará acessível dentrofoo
.Para usar
bar
você precisa executá-lo dentrofoo
.fonte