具有名称空间的Javascript动态函数调用

Rag*_*azs 2 javascript eval function dynamic

而使用eval不是一种好的编程习惯。这个问题是出于教学目的,或者是为了寻求更好的解决方案:

请参见以下Javascript示例:

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

foo.bar('aaa'); // trigger alert('aaa')
window['foo']['bar']('bbb'); // trigger alert('bbb')
Run Code Online (Sandbox Code Playgroud)

我在寻找一个通用的主叫工作,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
Run Code Online (Sandbox Code Playgroud)

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

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

我该如何做而没有 eval

Amb*_*mps 5

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

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
Run Code Online (Sandbox Code Playgroud)