如何避免使用eval调用不同的函数

时间:2019-01-24 14:43:26

标签: javascript angularjs

我有包含eval的这段代码,因为我发现最容易调用进行不同Web服务调用的不同工厂函数。

我已经读到这样做是不安全和“适当”的方式。好吧,我无法思考或找到适合我需要的更好方法。

如何改善通话?

vm.saveRecord = function() {
    var service = '';

    if(vm.valueTrue) {
        service = vm.otherValue ? 'function1' : 'function2';
    } else {
        service = vm.otherValue ? 'function3' : 'function4';
    }

    eval(service).callEndPoint(param1, param2).then(
        function successCallback(response) {
            if(response) {
                //successful response
            }
        }, function errorCallback(response) {
            //error
        }
    )
};

2 个答案:

答案 0 :(得分:2)

您可以使用功能手柄执行功能。这将是对该函数的引用:

//existing functions
function one() {   console.log("one")   };
function two() {   console.log("two")   };
function three() { console.log("three") };

//function that will execute other functions
function exec(number) {
  //we will assign a function here
  let toExecute;
  
  //simple condition to choose the function to execute at the end
  if (number == 1) {
    toExecute = one;
  } else if (number == 2) {
    toExecute = two;
  } else if (number == 3) {
    toExecute = three;
  }
  
  //adding () executes whatever function is assigned to the variable
  toExecute();
}


exec(3);
exec(2);
exec(1);

答案 1 :(得分:2)

您可以直接使用其中任一功能

nx=1

或将功能移动到键为访问器的对象中。

vm.saveRecord = function() {
    var service = vm.valueTrue
            ? vm.otherValue
                ? function1
                : function2
            : vm.otherValue
                ? function3
                : function4;

    service.callEndPoint(param1, param2).then(
        function successCallback(response) {
            if(response) {
                //successful response
            }
        }, function errorCallback(response) {
            //error
        }
    )
};