Javascript:有没有办法在不使用eval()的情况下将字符串用作回调?

时间:2016-11-02 10:09:21

标签: javascript string callback eval

所以我需要在我的一个函数中进行回调,但由于整个程序的工作方式,我需要以字符串的形式而不是函数本身传递回调函数名。

例如:

function doThings(callback){
    alert('hello');
    eval(callback + '();');
}

function test(){
    alert('world!');
}

var func = 'test';

doThings(func);

简而言之,我试图动态更改使用的函数,我必须使用字符串来表示回调函数,而不是实际的函数引用。

我一直在阅读eval是邪恶的 - 有没有办法在没有eval()的情况下做到这一点?

编辑:我无法事先列出对象中的函数。我还需要将一个数组作为单独的参数传递给这个函数,由于某种原因,.apply()window[callback]()

相处得不好

3 个答案:

答案 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");