tipos - retornar valor de una funcion javascript
FunciĆ³n anidada de JavaScript (6)
Tengo un 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, aclara esto. Gracias
Cuando declara una función dentro de una función, las funciones internas solo están disponibles en el ámbito en el que se declaran, o en su caso, el pad2
solo se puede llamar en el ámbito dmy
.
Todas las variables existentes en dmy
son visibles en pad2
, pero no ocurre al revés: D
Es perfectamente normal en Javascript (y en muchos idiomas) tener funciones dentro de funciones.
Tómese el tiempo para aprender el idioma, no lo use sobre la base de que es similar a lo que ya sabe. Sugeriría ver la serie de presentaciones de YUI de Douglas Crockford en Javascript, con especial énfasis en el Acto III: Funcionalidad definitiva (enlace a la descarga de videos, diapositivas y transcripción)
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 desde el ámbito externo.
function foo() {
function bar() {
return 1;
}
return bar();
}
foo
manipula la bar
dentro de sí mismo. bar
no se puede tocar desde el alcance exterior a menos que esté definida en el alcance externo.
Entonces esto no funcionará
function foo() {
function bar() {
return 1;
}
}
bar(); // throws error: bar is not defined
Las funciones son otro tipo de variable en JavaScript (con algunos matices, por supuesto). Crear 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 total del espacio de nombres global.
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 al que se pueda acceder fuera de la función:
function foo(doBar)
{
function bar()
{
console.log( ''bar'' );
}
function baz()
{
console.log( ''baz'' );
}
window.baz = baz;
if ( doBar ) bar();
}
En este ejemplo, la función baz estará disponible para su uso después de que se haya ejecutado la función foo
, ya que se reemplazó window.baz
. La función de barra no estará disponible para ningún otro contexto que no sean los ámbitos incluidos en la función foo
.
como un ejemplo diferente:
function Fizz(qux)
{
this.buzz = function(){
console.log( qux );
};
}
La función Fizz
está diseñada como un constructor para que, cuando se ejecute, asigne una función de buzz
al objeto recién creado.
Se llama cierre .
Básicamente, la función definida dentro de otra función solo es accesible dentro de esta función. Pero puede pasar como resultado y luego se puede llamar este resultado.
Es una característica muy poderosa. Puedes ver más explicaciones aquí:
function x() {}
es equivalente (o muy similar) a
var x = function() {}
a menos que esté equivocado.
Entonces no hay nada divertido pasando.