如何调用存储在具有不确定深度的变量中的函数

时间:2013-08-17 20:05:38

标签: javascript callback

我看了看这个:

Calling a JavaScript function named in a variable

但它没有回答我的问题。

这通常有效:

window['class']['sub_class']['function_name'](data);

但是现在我正在尝试创建一个可以处理任何深度的通用函数:

function callbackFunction(callback, data){
    //callback = a.b.c, or a.b, or a
    callback = explode(callback);      

    //I need to be able to call callbackFunction and somehow callback and form their proper form below
    window[callback.a](data);
    //or
    window[callback.a][callback.b](data);
    //or
    window[callback.a][callback.b][callback.c](data);
}

2 个答案:

答案 0 :(得分:1)

我相信Bergi建议的副本只能解决你问题的一半。由于您的最终值将是一个函数,并且由于该函数是对象的成员,因此您将最终在错误的上下文中执行它(即,使用错误的this值。)

我建议你使用这样的东西:

function getCallback(path) {
    var arr = path.split('.');
    var k;
    var fn = window;
    while(k = arr.shift()) {
        if(typeof fn[k] === "function") {
            fn = fn[k].bind(fn);
        } else {
            fn = fn[k]; 
        }
    }

    if(typeof fn === "function") return fn;
    return function(){};
}

http://jsfiddle.net/7CEd5/

将回调中this的值与使用Convert string in dot notation to get the object reference的答案得到的值进行比较。

答案 1 :(得分:0)

您可以根据需要将引用链接到对象/子对象/等。如果您有一个以点分隔的字符串(例如"document.blah.blah2.method"),那么您需要将其拆分为单个令牌(例如["document", "blah", "blah2", "method"])。

然后,这只是循环链的问题:

var c = window;
for (var i = 0; i < chain.length - 1; i++) {
  c = c[chain[i]];
}
c[chain[chain.length-1]](some_arguments);