2012-04-14 17 views
6

Tengo el siguiente código y me pregunto cómo hacer funcionar la última línea. Addopté un conjunto de api que se agregó a la vista de uso actual como convención de espacios de nombres y preferiría usar algo como arc.view. $ Function_name. THXjavascript llamando a una función en el objeto ventana

var arc={}; 
arc.view={ 
    say_hello: function(){ 
    alert("I want to say hello"); 
    } 
} 
function say_goodbye(){ 
    alert("goodbye to you"); 
} 

arc.view.say_hello(); // works 
window['say_goodbye'](); // works 
// possible to make this work? 
window['arc.view.say_hello'](); 
+2

debido a ti estoy terminando mi día de lucha con un éxito ... gracias +1 –

+0

@vikasdevde :) thumbs up ... +1 – agpt

Respuesta

10
window['arc']['view']['say_hello'](); 

o

window.arc.view.say_hello() 

o

window['arc'].view['say_hello']() 

O bien la sintaxis con punto o la sintaxis soporte va a funcionar. La sintaxis de puntos es en realidad solo azúcar sintáctica para una búsqueda de propiedades basada en corchetes, por lo que todos los fragmentos de código anteriores son idénticos. Use la sintaxis del paréntesis cuando el nombre de la propiedad en sí sea un valor dinámico, o cuando use el nombre de la propiedad en la sintaxis del punto causaría un error de sintaxis. Por ejemplo:

var dynamicMethodName = someObject.getMethodName(); 
someOtherObject[dynamicMethodName](); 

o

someOtherObject["a key string with spaces and {special characters}"](); 
3

Prueba este:

jsFiddle

window["arc"]["view"]["say_hello"](); 
2

Utilizando la notación de corchetes en realidad se está pidiendo para ejecutar una función en la ventana llamado arc.view.say_hello, y no una función en el objeto view (que es una propiedad del objeto arc). Para ser más explícito:

window["arc.view.say_hello"] = function() { alert("hi") }; 

window["arc.view.say_hello"](); // "hi" 

Si desea llamar a una función de la forma que ha descrito, hay que "resolver" la cadena de objetos. Puede crear una función de utilidad para eso. Algo así como:

var arc={}; 
arc.view={ 
    say_hello: function(){ 
    alert("I want to say hello"); 
    } 
} 
function say_goodbye(){ 
    alert("goodbye to you"); 
} 

function call(id) { 
    var objects = id.split("."); 
    var obj = this; 

    for (var i = 0, len = objects.length; i < len && obj; i++) 
     obj = obj[objects[i]]; 

    if (typeof obj === "function") 
     obj(); 
} 

call("say_goodbye"); 
call("arc.view.say_hello"); 

También podría extender la función de utilidad de usar arguments (o lo que podría devolver la referencia a la función).

Cuestiones relacionadas