2013-01-23 145 views
1

而使用eval不是一个好的编程习惯。这个问题是说教性质的,或学习更好的解决方案:使用命名空间的Javascript动态函数调用

见在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 

但我可以调用USI NG EVAL:

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

我怎样才能做到这一点eval

+0

这几乎每天都被问到。等一下,找那些傻瓜。 –

+1

http://stackoverflow.com/q/14375753/989121 – georg

+1

可能重复[是否邪恶使用eval将字符串转换为函数?](http://stackoverflow.com/questions/14396647/is-it -evil-to-use-eval-to-convert-a-string-to-a-function) –

回答

-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'); 

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

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

请不要发布重复的答案。只需链接到您之前的帖子并投下closevote即可。 – georg

+0

这实际上不是重复的答案。我修改和改进了这一个。 – Amberlamps

+0

通过改进和提供链接来编辑原始文件可能是更好的选择。你的答案也不提供任何解释。我想知道为什么这个功能有效。 – jwize