假设我有一个包含我想要运行的函数名称的变量,我可以使用window
运行它,就像这样;
var func = "myFunc",
myFunc = function(){ ... };
window[func](); // run the function in the func var
但是,如果预期的功能在对象内部深处,则不起作用;
var obj = {
foo: {
hey: function(){ ... }
}
};
obj.foo.hey(); // this runs
var func = "obj.foo.hey";
window[func](); // this doesn't
我可以使用eval()
,但我想知道是否可以避免这种情况,以免引入eval()
附带的许多安全注意事项。
当函数在如上所述的对象中时,如何运行变量中指定的函数?
答案 0 :(得分:1)
您可以迭代拆分的func
并返回步行对象的结果。
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

答案 1 :(得分:0)
您可以在单个字符串下传递嵌套属性。它必须像动态一样动态完成。
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()