【问题标题】:Calling javascript function with an objectstring in dot notation使用点表示法的对象字符串调用 javascript 函数
【发布时间】:2011-10-02 12:01:31
【问题描述】:

假设我有字符串:

var string = "function";

window[string];

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

但是,当我有:

var string2 = "function.method.weHaveTogoDeeper";

它应该调用

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

我做不到:

window[string2]

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

【问题讨论】:

  • 我几乎问了同样的问题,会投票 10 次 :)

标签: javascript string function object


【解决方案1】:
function index(x,i) {return x[i]}
string2.split('.').reduce(index, window);

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

【讨论】:

  • 函数式编程万岁。
  • reduce 并非所有浏览器都广泛支持(大多数现代浏览器除外)
  • @Mrchief:我不同意,尽管感谢您没有说“这不是标准的”,并且正确地说大多数现代浏览器都支持它。 =) 每次我使用 .map.foreach(它们在 JavaScript/ECMAscript 规范中!)时,我都会得到一些此评论的变体,并且所有浏览器都支持。 kangax.github.com/es5-compat-table 如果支持旧版本的 Internet Explorer(8 及更低版本)是个问题,如果检测到 IE8,请包含 developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
  • 相信在执行浏览器本身没有reduce功能的情况下,你可以使用underscore.js提供reduce功能
【解决方案2】:

不久前我写过一篇:

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范围内定义,并返回找到的全局函数。

【讨论】:

    【解决方案3】:

    您可以使用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"]
    

    【讨论】:

    • foo.bar 不是 window 的属性,尽管 foo 可能是。您必须先取消对 foo 的引用,然后才能访问它的属性栏。
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2011-07-07
    • 2014-11-06
    相关资源
    最近更新 更多