2017-01-03 109 views
1

假设我有一个包含我想运行的函数名称的变量,我可以使用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

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

回答

1

你可以遍历拆分func并返回一个walked对象的结果。

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

可以的传球嵌套一个字符串下的性能。它必须像动态一样完成。

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

相关问题