Javascript:有没有一种方法可以在不使用eval()的情况下将字符串用作回调?
所以我需要在我的一个函数中进行回调,但是由于整个程序的工作方式,我需要以字符串的形式传递回调函数名,而不是函数本身 例如:Javascript:有没有一种方法可以在不使用eval()的情况下将字符串用作回调?,javascript,string,callback,eval,Javascript,String,Callback,Eval,所以我需要在我的一个函数中进行回调,但是由于整个程序的工作方式,我需要以字符串的形式传递回调函数名,而不是函数本身 例如: function doThings(callback){ alert('hello'); eval(callback + '();'); } function test(){ alert('world!'); } var func = 'test'; doThings(func); 简而言之,我正在尝试动态更改使用的函数,我必须使用字符串来表
function doThings(callback){
alert('hello');
eval(callback + '();');
}
function test(){
alert('world!');
}
var func = 'test';
doThings(func);
简而言之,我正在尝试动态更改使用的函数,我必须使用字符串来表示回调函数,而不是实际的函数引用
我一直在读eval是邪恶的-没有eval()
,有什么方法可以做到这一点吗
编辑:我不能预先列出对象中的函数。我还需要将数组作为单个参数传递给此函数,并且由于某些原因,
.apply()
与窗口[callback]()
不能很好地将函数存储在对象中。使用属性名称访问它们
函数doThings(回调){
警惕(“你好”);
我的函数[回调]();
}
功能测试(){
警惕(“世界!”);
}
var my_可能的函数={};
my_可能的函数。测试=测试;
var func=‘测试’;
doThings(func)代码>非常类似于@的答案,但需要额外检查
- 检查它是否是当前对象的一部分
- 检查值是否为
函数类型
。如果value不是一个函数,它将破坏您的代码
函数doThings(回调){
log('hello',回调);
试一试{
回调列表[回调]()
}捕获(ex){
console.log(例如message)
}
callbackList.hasOwnProperty(callback)和&typeof(callbackList[callback])==='function'和&callbackList[callback]()
}
Object.prototype.test3=函数(){
log(“不应调用此函数”);
}
var callbackList={
测试:功能测试(){
console.log('world!');
},
测试2:“世界”
}
doThings(“测试”);
doThings(“测试2”);
doThings(“测试3”)代码>您可以这样做
函数doThings(回调){
警惕(“你好”);
窗口[回调]();
}
功能测试(){
警惕(“世界!”);
}
var func=‘测试’;
doThings(func)代码>您所处的环境是什么?在浏览器中,您可以执行doThings(window[func])、window['test']()等操作,这样您就可以从父作用域对象按名称访问该函数。@DevDig它在浏览器中。我试过了,但是执行window[func]().apply(null,args)不起作用。我应该早点提到这一点。我还需要将数组作为单个参数传递给函数。话虽如此,如果我将eval()中的所有变量都限制为字母数字,那么使用eval()是否一定不安全?这怎么会比生成SQL和清理输入更不安全呢?window[func]()应该和window[func].apply(null,args)一样做这件事。关于邪恶评估的一些信息:更新,这是以前的测试,忘记删除;)我正要发布完全相同的解决方案。可能值得一提的是(如果不是非常重要的话),回调函数需要具有全局作用域才能工作。我已经尝试了第一个,但在我的代码中,我需要使用apply(),以便将数组作为单个参数传递给回调函数。不过我喜欢第二个。我想我会试试的。谢谢不幸的是,在我目前的情况下,我没有能力列出这样一个对象中的所有函数。@Archer我想我们对这个想法投了赞成票。是的,有一个输入错误,但我想想法更重要,Tone也可以使用快捷方式var my_-mably_-functions={test}代码>在我的情况下,我无法使对象充满回调。