0

示例代码:(请不要 eval())

    var stringReference = "obj.inner.method";
    var namespace = stringReference.split(".");

    // Now I need to Call window[namespace].call();

我对如何构建函数调用有点困惑。最终结果应该是这样的?

    window[obj][inner][method].call();

语境:

    <div data-attribute="click:obj.inner.method" > </div>

我正在获取数据属性并基于数据属性绑定事件侦听器。另外,提前谢谢。

4

4 回答 4

3

尝试这样的事情:

function getNamespace(base, path) {
    path = path.split('.');
    for (var i = 0; i < path.length; i++) {
        base = base[path[i]]
    }
    return base;
}

像这样使用它:

getNamepspace(window, 'obj.inner.method');
于 2013-11-12T21:12:24.310 回答
1

您可以制作一个递归函数,例如

function getProp(obj, keys) {
    if (keys.length) return getProp(obj[keys.shift()], keys);
    return obj;
}

接着

getProp(window, 'document.body'.split('.')); // <body>

循环也可以工作,在这种情况下你可以把它写成

function getProp(obj, keys) {
    var k;
    while (keys.length) k = keys.shift(), obj = obj[k];
    return obj;
}

请注意,在我使用的这些示例中shift,它们具有副作用。

于 2013-11-12T21:12:06.537 回答
1

我想你可以做这样的事情:

var namespaces = stringReference.split(".");
var reference = window;
var i = 0;
do {
    reference = reference[namespaces[i]];
    i++;
} while(reference && i < namespaces.length);

if(reference) {
    reference.call();
}

你甚至可以封装在一个函数中:

function getNamespacedObject(root, path) {
    var paths = path.split(".");
    var reference = root;

    var i = 0;
    do {
        reference = reference[namespaces[i]];
        i++;
    } while(reference && i < namespaces.length);

    return reference;
}

然后,您可以通过 调用它var obj = getNamespacedObject(window, "my.namespaced.object");

于 2013-11-12T21:12:18.147 回答
0

基于“sp0rkyd0rky”和“Paul S”的另一个建议。那些 :

function fetch(base, path) {
    if (!path) { path = base; base = window; }
    path = path.split('.');
    while (path.length) base = base[path.shift()];
    return base;
}

base参数是可选window的,默认引用:

fetch(window, 'obj.inner.method') === fetch('obj.inner.method'); // true

您也可以看看这个答案:https ://stackoverflow.com/a/18892106/1636522 。但是,您应该考虑许多缺点(安全性、性能、可维护性、可调试性......):https ://stackoverflow.com/a/4599946/1636522 。

于 2013-11-13T06:54:38.383 回答