2017-01-03 4 views
1

Angenommen, ich habe eine Variable, die den Namen einer Funktion enthält, die ich ausführen möchte, kann ich es mit window ausführen, so;Ausführen einer Funktion in einem Objekt aus einer Variablen

Dies funktioniert jedoch nicht, wenn die beabsichtigte Funktion tief in einem Objekt ist;

var obj = { 
    foo: { 
    hey: function(){ ... } 
    } 
}; 

obj.foo.hey(); // this runs 


var func = "obj.foo.hey"; 

window[func](); // this doesn't 

ich eval() verwenden könnte, aber ich frage mich, ob es möglich ist, das zu vermeiden, um nicht die vielen Sicherheitsüberlegungen vorstellen, dass eval() kommt mit.

Wie kann ich eine in einer Variablen angegebene Funktion ausführen, wenn sich die Funktion wie oben beschrieben in einem Objekt befindet?

+0

http://stackoverflow.com/questions/1184123/is-it-possible-to-add-dynamically-named-properties-to-javascript-object – Teemu

Antwort

1

Sie könnten die aufgeteilte func iterieren und das Ergebnis eines gelaufenen Objekts zurückgeben.

function getValue(object, path) { 
 
    return path.split('.').reduce(function (o, k) { 
 
     return (o || {})[k]; 
 
    }, object); 
 
} 
 

 
var obj = { foo: { hey: function() { console.log('hey'); } } }, 
 
    func = "obj.foo.hey"; 
 

 
getValue(window, func)(); 
 
(getValue(window, 'bar') || function() {})(); // default function, prevent exception

0

Sie können die Eigenschaften in einem einzigen String verschachtelt passieren. Es muss dynamisch wie gemacht werden.

var obj = { 
 
    foo: { 
 
    hey: function(){console.log("i run")} 
 
    } 
 
}; 
 

 
obj.foo.hey(); // this runs 
 

 

 
var route = ["obj","foo","hey"], 
 
    func = route.reduce((f,r) => f[r], window); 
 

 
func()

Verwandte Themen