2010-11-25 27 views
5

Estoy tratando de acceder a una función anidada pasando el nombre de la función como una cadena y llamándola. Por ejemplo, consulte this publicaciónLlamar a la función anidada cuando se pasa el nombre de la función como una cadena

function outer(action){ 
    window["outer"][action](); 

    function inner(){ 
     alert("hello"); 
    } 
} 
outer("inner"); 

Sin embargo, no funciona. Error:

window.outer[action] is not a function 

Cómo hacer que esto funcione, o una forma alternativa de llamar a una función anidada.

La razón de esto es que estoy tratando de ocultar un conjunto de funciones que son llamadas por un iframe dentro de un alcance de funciones.

Respuesta

6
function outer(action){ 
    var inner = { 
    func1: function() {}, 
    func2: function() {}, 
    func3: function() {}, 
    // ... 
    } 
    inner[action](); 
} 

outer("func1"); 
+1

Gracias. Funciona una delicia – SystemicPlural

+0

me alegro de poder ayudar :) – galambalazs

1

De esta forma, intenta acceder a la propiedad "interior" de la función "exterior" (exterior.inner) que no está definida. La única manera de hacerlo es mediante el uso de eval:

function outer(action){ 
    eval(action+"()"); 

    function inner(){ 
     alert("hello"); 
    } 
} 
outer("inner"); 

Pero recuerde que el examen es malo en algunas situaciones, así que tenga cuidado.

+0

eval. urgggh. galambalazs se le ocurrió una solución. – SystemicPlural

+1

No morirás si usas eval confía en mí :) – mck89

+1

Sí, no morirás, Crockford no te matará, solo te torturará hasta el final de los tiempos: P –

Cuestiones relacionadas