Obtuve un fragmento de código para javascript que simplemente no entiendo:
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;
}
¿Cómo se puede definir una función dentro de otra función? ¿Podemos llamar a pad2 () desde fuera de mi función ()?
Por favor, ponle algo de luz. Gracias
javascript
nested-function
Thomas
fuente
fuente
Respuestas:
Las funciones son otro tipo de variable en JavaScript (con algunos matices, por supuesto). La creación de una función dentro de otra función cambia el alcance de la función de la misma manera que cambiaría el alcance de una variable. Esto es especialmente importante para su uso con cierres para reducir la contaminación global total del espacio de nombres.
Las funciones definidas dentro de otra función no serán accesibles fuera de la función a menos que se hayan adjuntado a un objeto que sea accesible fuera de la función:
En este ejemplo, la función baz estará disponible para su uso después de que la
foo
función se haya ejecutado, ya que está anuladawindow.baz
. La función de barra no estará disponible para ningún contexto que no sean los ámbitos contenidos en lafoo
función.como un ejemplo diferente:
La
Fizz
función está diseñada como un constructor de modo que, cuando se ejecuta, asigna unabuzz
función al objeto recién creado.fuente
Se llama cierre .
Básicamente, la función definida dentro de otra función es accesible solo dentro de esta función. Pero se puede pasar como resultado y luego se puede llamar a este resultado.
Es una característica muy poderosa. Puedes ver más explicación aquí:
javascript_closures_for_dummies.html espejo en Archive.org
fuente
es equivalente (o muy similar) a
a menos que me equivoque.
Así que no pasa nada divertido.
fuente
La instanciación de funciones está permitida dentro y fuera de las funciones. Dentro de esas funciones, al igual que las variables, las funciones anidadas son locales y, por lo tanto, no se pueden obtener del ámbito externo.
foo
manipulabar
dentro de sí mismo.bar
no se puede tocar desde el alcance externo a menos que esté definido en el alcance externo.Entonces esto no funcionará:
fuente
Cuando declaras una función dentro de una función, las funciones internas solo están disponibles en el ámbito en el que están declaradas, o en tu caso,
pad2
solo se pueden llamar en eldmy
ámbito.Todas las variables existentes en
dmy
son visibles enpad2
, pero no sucede al revés: Dfuente
Es perfectamente normal en Javascript (y muchos lenguajes) tener funciones dentro de funciones.
Tómate el tiempo para aprender el idioma, no lo uses sobre la base de que es similar a lo que ya conoces. Sugeriría ver la serie de presentaciones de YUI de Douglas Crockford en Javascript, con especial énfasis en el Acto III: Función lo último (enlace para descarga de video, diapositivas y transcripción)
fuente
Lanzará un error. Dado que
bar
está definido por dentrofoo
,bar
solo será accesible por dentrofoo
.Para usarlo
bar
necesitas ejecutarlo adentrofoo
.fuente