所以我需要在我的一个函数中进行回调,但由于整个程序的工作方式,我需要以字符串的形式而不是函数本身传递回调函数名。
例如:
function doThings(callback){
alert('hello');
eval(callback + '();');
}
function test(){
alert('world!');
}
var func = 'test';
doThings(func);
简而言之,我试图动态更改使用的函数,我必须使用字符串来表示回调函数,而不是实际的函数引用。
我一直在阅读eval是邪恶的 - 有没有办法在没有eval()
的情况下做到这一点?
.apply()
与window[callback]()
相处得不好
答案 0 :(得分:6)
将函数存储在对象中。使用属性名称来访问它们。
function doThings(callback) {
alert('hello');
my_possible_functions[callback]();
}
function test() {
alert('world!');
}
var my_possible_functions = {};
my_possible_functions.test = test;
var func = 'test';
doThings(func);
答案 1 :(得分:4)
你可以这样做。
function doThings(callback){
alert('hello');
window[callback]();
}
function test(){
alert('world!');
}
var func = 'test';
doThings(func);
或者您可以在字符串中传递完整函数并使用Function
构造函数。
function doThings(callback){
alert('hello');
(new Function('return '+callback)())();
}
function test(){
alert('world!');
}
var func = test.toString();
doThings(func);
答案 2 :(得分:0)
@ Quentin的非常相似的答案,但附加检查
function
类型。如果value不是函数,则会破坏您的代码。
function doThings(callback) {
console.log('hello ', callback);
try {
callbackList[callback]()
} catch (ex) {
console.log(ex.message)
}
callbackList.hasOwnProperty(callback) && typeof(callbackList[callback]) === 'function' && callbackList[callback]()
}
Object.prototype.test3 = function() {
console.log("this should not be called");
}
var callbackList = {
test: function test() {
console.log('world!');
},
test2: "World"
}
doThings('test');
doThings("test2");
doThings("test3");