2011-09-03 14 views
64

Tengo una pieza de código JavaScript que acabo no entiendo:JavaScript función anidada

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 puede funcionar definirse dentro de otra función? ¿Podemos llamar a pad2() desde fuera de mi función()?

Por favor, aclare esto. Gracias

+8

funciones pueden ser creados dentro de las funciones. Eso es perfectamente válido. – 0x499602D2

Respuesta

109

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 hayan sido unido a un objeto que es accesible 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 de baz estará disponible para usar después de que se haya ejecutado la función foo, ya que está anulada 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ñado como un constructor de manera que, cuando se ejecuta, se asigna una función buzz al objeto recién creado.

+0

¿Qué es window.baz = baz? ¿Por qué esta línea m? Ke baz está disponible? –

+0

@ZiyangZhang, el párrafo después de ese bloque de código tiene la explicación, ¿hubo alguna parte en particular que no está clara? – zzzzBov

+0

Esto es ineficiente tanto en velocidad como en memoria .. vea mi respuesta a continuación – kofifus

12
function x() {} 

es equivalente (o muy similar) a

var x = function() {} 

si no me equivoco.

Así que no pasa nada divertido.

+5

La primera sintaxis se moverá al inicio del documento. por lo que es posible llamar a la función 'x' antes de inicializar la función. – Tom

+5

La primera sintaxis también le proporcionará trazas de pila mucho más agradables con funciones nombradas; la segunda le dará un dolor de cabeza – TheZ

7

La creación de instancias 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 bar dentro de sí mismo. bar no se puede tocar desde el alcance exterior a menos que esté definido en el alcance exterior.

Así que esto no va a funcionar:

function foo() { 
    function bar() { 
     return 1; 
    } 
} 

bar(); // throws error: bar is not defined 
3

es perfectamente normal en Javascript (y en muchos idiomas) que tienen 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 usted ya sabe. Sugeriría ver la serie de presentaciones de YUI de Douglas Crockford en Javascript, con especial atención en Act III: Function the Ultimate (enlace a descarga de videos, diapositivas y transcripción)

4

Cuando declara 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 su caso, el pad2 solo se puede llamar en el alcance dmy.

Todas las variables existentes en dmy son visibles en pad2, pero no sucede a la inversa: D

26

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. Se puede ver una explicación más detallada aquí:

javascript_closures_for_dummies.html mirror on Archive.org