使用点表示法中的对象字符串调用javascript函数

Calling javascript function with an objectstring in dot notation

本文关键字:字符串 对象 调用 javascript 函数 表示      更新时间:2023-09-26

假设我有字符串:

var string = "function";

window[string];

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

但是,当我有:

var string2 = "function.method.weHaveTogoDeeper";

它应该调用

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

我做不到:

window[string2]

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

您可以使用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"]
function index(x,i) {return x[i]}
string2.split('.').reduce(index, window);

edit:当然,如果您从函数名称的字符串中调用函数,您可能会做一些不雅的事情,这会让人反感,尤其是在协作编码设置中。我能想到的唯一合理的用例是编写一个测试框架,尽管可能还有更多的用例。因此,在遵循这个答案时请谨慎;应该使用数组,或者理想情况下使用直接引用。

我不久前写了一个:

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作用域中定义,并返回找到的全局函数。