2014-10-17 73 views
0

我想傳遞一個字符串到一個函數,然後將這個字符串作爲回調。 例如使用字符串調用沒有eval()函數()

app.on('notice', function(data) { 

    var callback = data.func; // this is a string 
    eval(callback + "()"); // trun string into an executable function 

}); 

但是我在防止他人使用eval()的環境中使用這個...我怎麼能改寫這不EVAL工作?

我已經試過:

var self = this; 
return function(){ self[callback]() }; 

但它不會調用該函數(和我沒有得到任何錯誤)

更新:我忘了我還需要處理參數:

eg

var params = ['param1', 'param2']; 

eval(callback + "("+ params +")"); 
+1

需要更多的上下文。你試圖調用的函數在哪裏,da​​ta.func能保存什麼? – epascarello 2014-10-17 11:59:34

回答

5

使用window對象。 更換您的通話eval()有:

window[callback](); 
+1

@epascarello:如果不是,'eval(callback +「()」);'也行不通。 – Cerbrus 2014-10-17 12:04:13

+0

謝謝,如果我有params?看到我更新的問題。因爲這似乎不起作用:'window [callback](params);' – Cameron 2014-10-17 12:20:36

+0

window [callback] .apply(window,params); – epascarello 2014-10-17 12:22:14

1

你可以使用一個Function構造。

var func = new Function("console.log('i am a new function')"); 
func(); 
+0

我不認爲這有幫助... – 2014-10-17 12:08:36

+0

那麼你也可以'eval()'它。 – Cerbrus 2014-10-17 12:08:43

+0

該op指出,他不能使用'eval()' – Alexander 2014-10-17 12:10:07