2013-01-23 49 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