Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:有没有一种方法可以在不使用eval()的情况下将字符串用作回调?_Javascript_String_Callback_Eval - Fatal编程技术网

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}在我的情况下,我无法使对象充满回调。