2010-05-17 13 views
5

Tengo el siguiente código JavaScript:JavaScript - ¿Cómo puedo llamar a una función dentro de una función?

function parentFunc() { 

    function childFunc() { 
     ... 
    } 

    ... 
} 

// outside of myParentFunc, how do I call myChildFunc() ? 
childFunc(); // doesn't work 

Como llamar desde fuera de childFunc()parentFunc()?

ACTUALIZACIÓN:

sé la respuesta obvia sería mover childFun fuera del parentFun, pero esto es una biblioteca de terceros que no puedo modificar.

+0

+1 alcance de la función de comprensión y variables globales en JavaScript es realmente importante. También es un gran punto de partida para aprender sobre la herencia prototípica. – Stephano

Respuesta

0

Sólo se declaran fuera de la función o_O

Bueno, si la biblioteca no proporciona una manera de hacerlo, modificarlo y subirlo con sus Js, probablemente, la biblioteca no le permite para hacerlo porque no deberías

+0

No puedo porque me estoy vinculando a una biblioteca de terceros. Entonces no puedo modificar el código. – CraigWl

+0

Edité la respuesta. –

2

Esta sería una manera en que podría hacerlo.

var myChildFunction; 

function myParentFunc() { 
    //.... 
    myChildFunction = function() { 
    //.... 
    } 
    myChildFunction(); 
} 

myChildFunction(); 

Aquí es otra forma

var myChildFunction = function() { 
    //....  
} 


function myParentFunc() { 
    //.... 
    myChildFunction(); 
} 

myChildFunction(); 
+0

Esto no funcionará hasta que llame a la función principal. – SLaks

+0

La segunda instancia funcionará sin llamar a la función principal. Haga su elección y determine qué funciona mejor en su ubicación. –

-1
function parentFunc() { 

    var childFunc = function() { 
     ... 
    } 

    ... 
} 

childFunc(); // works 
+2

En realidad no es así. – Tgr

+0

Esto no funcionará porque JavaScript tiene alcance de función. childFunc solo es "visible" dentro de parentFunc. – Stephano

+0

Gracias, no lo sabía. –

2

Es posible que desee considerar el uso de la Yahoo Module Pattern lugar:

myModule = function() { 

    //"private" variables: 
    var myPrivateVar = "I can be accessed only from within myModule." 

    //"private" methods: 
    var myPrivateMethod = function() { 
     console.log("I can be accessed only from within myModule"); 
    } 

    return { 
     myPublicProperty: "I'm accessible as myModule.myPublicProperty." 

     myPublicMethod: function() { 
      console.log("I'm accessible as myModule.myPublicMethod."); 

      //Within myModule, I can access "private" vars and methods: 
      console.log(myPrivateVar); 
      console.log(myPrivateMethod()); 
     } 
    }; 
}(); 

a definir sus miembros privados donde myPrivateVar y myPrivateMethod están definidos, y sus miembros públicos donde se definen myPublicProperty y myPublicMethod.

Simplemente puede acceder a los métodos públicos y propiedades como sigue:

myModule.myPublicMethod(); // Works 
myModule.myPublicProperty; // Works 
myModule.myPrivateMethod(); // Doesn't work - private 
myModule.myPrivateVar;  // Doesn't work - private 
+0

Parece muy interesante. Entonces, ¿cuál es el código para que esto funcione sin tener que usar la biblioteca YUI? – CraigWl

+0

@CraigWl: Ese fragmento funciona como está. Simplemente reemplace los métodos y las propiedades con cosas significativas. No necesitas YUI. Se llama el patrón del Módulo YUI porque Yahoo lo utilizó por primera vez para YUI. –

2

Si usted no puede modificar el código, no hay manera de hacerlo. De lo contrario asignar la función interna a algo que se puede acceder, cambiando la línea

function childFunc() { 

a, por ejemplo,

window.cf = childFunc() { 

continuación, puede acceder a la función a través de la variable cf. (Hay muchas otras maneras de hacerlo, este es el que requiere el menor cambio en el código de terceros).)

+0

Wow, nunca jamás deberías modificar el objeto de la ventana. ¿Por qué no hacer tu propio objeto para modificar? – Stephano

+0

Stephano, ¿se da cuenta de que cada vez que crea una variable global está agregando al objeto ventana, como en el ejemplo anterior? – rob

+0

Si JavaScript decide poner todas las variables globales en un lugar diferente algún día, ¿qué hace ese código? Siempre es una buena forma de mantener sus manos fuera del tarro de galletas :). – Stephano

0

Esto es lo que puede hacer:

adjuntar la función interna a lo global:

function parentFunc() { 

    window.childFunc = function(){ 

    } 

} 

Esta es una especie de gueto aunque :)

Así que me gustaría utilizar algunos de los más OO patrones sofisticados, como el golpeteo módulo:

function parentFunc() { 

    var someVar; 

    var childFunc = function(){ 

    }; 


    return { 
     childFunc, 
     someVar 
    } 

} 

parentFunc.childFunc(); 

este modo, puede volver yo tu función interna y tu valor de retorno.

Recuerde, el hecho de que no puede llamar a su función interna, es una característica de JS no es una limitación.

1

Hay una forma de hacer esto muy simple, pero también es una muy mala práctica para entrar. Sin embargo, debido a que las variables globales OCCATIONALLY son prácticas, mencionaré esto. Tenga en cuenta que en la situación que describe no es un buen ejemplo del uso de variables globales.

El siguiente código funcionará pero es código horrible.

function parentFunction() { 
    ... 
    childFunction = function() { 
    ... 
    } 
} 

childFunction(); 

Estás haciendo childFunction global, que generalmente es una idea horrible. El uso de espacios de nombres es una forma de evitar la locura de la variable global.

ABV = {}; 
ABV.childFunction = function() { 
    ... 
} 
ABV.parentFunction = function() { 
    ... 
    ABV.childFunction(); 
    ... 
} 
ABV.childFunction(); 

Así es como funcionan las bibliotecas como DWR y otras. usan 1 variable global y ponen a todos sus hijos dentro de esa variable global.

Pensar en cómo funciona el alcance en JavaScript es realmente importante. Si comienzas a lanzar variables globales a tu alrededor, seguramente te encontrarás con muchos problemas. Según el ejemplo que está usando, es evidente que necesita algo así como una clase de "funciones" a las que pueda llamar desde cualquier lugar. Espero que ayude.

Cuestiones relacionadas