假设我有字符串:
var string = "function";
使用
window[string];
我可以调用一个名为“function”的函数。
但是,当我有:
var string2 = "function.method.weHaveTogoDeeper";
它应该调用
window["function"]["method"]["weHaveTogoDeeper"]
我做不到:
window[string2]
在这种情况下。我不知道“。”的数量。在字符串中,所以我需要一些例程。
答案 0 :(得分:9)
您可以使用.
方法将字符串拆分为String.split
:
var string2 = "function.method.weHaveTogoDeeper";
var methods = string2.split(".");
在此示例中,methods
将是数组["function","method","weHaveTogoDeeper"]
。您现在应该可以对此数组执行简单的迭代,在前一个数组的结果上调用每个函数。
我想到的迭代是这样的:
var result = window;
for(var i in methods) {
result = result[methods[i]];
}
在您的示例中,result
现在应该与
window["function"]["method"]["weHaveTogoDeeper"]
答案 1 :(得分:6)
function index(x,i) {return x[i]}
string2.split('.').reduce(index, window);
编辑当然,如果你从他们名字的字符串中调用函数,你可能会做一些不优雅的事情,这会让人不悦,特别是在协作编码设置中。我能想到的唯一用例就是编写一个测试框架,尽管可能还有一些案例。因此,请在关注此答案时谨慎使用;应该使用数组,或者理想的是直接引用。
答案 2 :(得分:1)
我前一段时间写了一篇:
function RecursiveMapper(handlerName, stack) {
// check if empty string
if(!handlerName || handlerName === '' || (handlerName.replace(/\s/g,'') === '')) return null;
var buf = handlerName.split('.');
stack = stack || window;
return (buf.length === 1) ? stack[buf[0]] : this.RecursiveMapper(buf.slice(1).join('.'), stack[buf[0]]);
}
这样称呼:RecursiveMapper(window[string2]);
这个还检查函数是否在window
范围中首先定义并返回找到的全局函数。