从变量中执行对象中的函数

时间:2017-01-03 12:35:05

标签: javascript

假设我有一个包含我想要运行的函数名称的变量,我可以使用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()附带的许多安全注意事项。

当函数在如上所述的对象中时,如何运行变量中指定的函数?

2 个答案:

答案 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()