Javascript动态函数调用命名空间

时间:2013-01-23 11:44:04

标签: javascript function dynamic eval

使用eval并不是一个好的编程习惯。这个问题是教学性的,或者是为了学习更好的解决方案:

请参阅Javascript中的以下示例:

var foo = foo || {};
foo.bar = function(str) { alert(str); };

foo.bar('aaa'); // trigger alert('aaa')
window['foo']['bar']('bbb'); // trigger alert('bbb')

我正在搜索通用调用方,以便与foo.bar('str')foo.nestedObj.bar(params)foo.n2.n[1..99].bar(params)

一起使用

多数民众赞成因为我不能称之为:

param = [5,2,0];
call = 'foo.bar';
window[call](param); // not work

但我可以使用eval调用函数:

param = [5,2,0];
call = 'foo.bar'
eval(call + '(param)'); // works

我该怎么做没有 eval

2 个答案:

答案 0 :(得分:4)

我之前已经回答了这个问题,但是又来了:

function genericFunction(path) {

    return [window].concat(path.split('.')).reduce(function(prev, curr) {
        return prev[curr];
    });

}

var param = [5, 2, 0];
var foo = { bar: function(param) { return param.length; } };

genericFunction('foo.bar')(param);

// => 3

答案 1 :(得分:-1)

callback = "foo.bar";
var p = callback.split('.'),
c = window; // "parent || window" not working in my tests of linked examples
for (var i in p) {
    if (c[p[i]]) {
        c = c[p[i]];
    } 
}
c('aaa');

这解决了这个问题。谢谢!