使用点表示法中的objectstring调用javascript函数

时间:2011-07-11 03:51:19

标签: javascript string function object

假设我有字符串:

var string = "function";

使用

window[string];

我可以调用一个名为“function”的函数。

但是,当我有:

var string2 = "function.method.weHaveTogoDeeper";

它应该调用

window["function"]["method"]["weHaveTogoDeeper"]

我做不到:

window[string2]

在这种情况下。我不知道“。”的数量。在字符串中,所以我需要一些例程。

3 个答案:

答案 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范围中首先定义并返回找到的全局函数。