函数中的eval

时间:2017-05-22 22:30:31

标签: javascript eval

所以大家,这个可能是一个简单回答的问题。在通过雄辩的javascript工作时,我遇到了一个他使用新的Function构造函数的例子。我想尝试使用我自己的函数createWithEval对这个构造函数进行反向工程,你猜对了eval()函数。我的函数采用name,arg和body参数,它们都是字符串。

 function createWithEval(name,arg,body){ 
      var bdy= "function ";
      var body2=name;
      var body3="("
      var body4=arg;
      var body5=")"
      bdy+=body2+=body3+=body4+=body5;
      var body6="{";
      var body7=body;
      var body8="}";
      bdy+=body6+=body7+=body8;
      console.log(bdy)
     return bdy;
    }
    eval(createWithEval("xtimesy","x,y","return x*y"));
    console.log(xtimesy(2,3))

上面的代码按预期创建了xtimesy函数,但是当我尝试将eval语句放在函数中时,函数在声明时弹出undefined

function createWithEval(name,arg,body){ 
  var bdy= "function ";
  var body2=name;
  var body3="("
  var body4=arg;
  var body5=")"
  bdy+=body2+=body3+=body4+=body5;
  var body6="{";
  var body7=body;
  var body8="}";
  bdy+=body6+=body7+=body8;
  console.log(bdy)
return eval(bdy); //should declare and return the xtimesy function
}
createWithEval("xtimesy","x,y","return x*y"); 
console.log(xtimesy(2,3)) // ---> xtimesy is undefined

我想我可能有范围错误或对eval函数如何工作的不正确理解。欢迎任何输入和/或解决方案。

1 个答案:

答案 0 :(得分:-1)

问题是您在eval函数中运行createWithEval,因此在createWithEval范围之外无法使用它。解决此问题的一种方法是使用eval.apply(window,[bdy])在全局范围内运行eval

function createWithEval(name,arg,body, ctx){ 
  var bdy= "function ";
  var body2=name;
  var body3="("
  var body4=arg;
  var body5=")"
  bdy+=body2+=body3+=body4+=body5;
  var body6="{";
  var body7=body;
  var body8="}";
  bdy+=body6+=body7+=body8;
    eval.apply(window, [bdy]);
}
createWithEval("xtimesy","x,y","return x*y");
console.log(xtimesy(2,3))