Javascript 函数中的求值

Javascript 函数中的求值,javascript,eval,Javascript,Eval,伙计们,这可能是一个简单的问题。在使用有说服力的javascript时,我遇到了一个他使用新函数构造函数的示例。我想尝试用我自己的函数createWithEval反向工程这个构造函数,你猜到了,使用eval()函数。我的函数采用名称、arg和body参数,它们都是字符串 function createWithEval(name,arg,body){ var bdy= "function "; var body2=name; var body3="("

伙计们,这可能是一个简单的问题。在使用有说服力的javascript时,我遇到了一个他使用新函数构造函数的示例。我想尝试用我自己的函数createWithEval反向工程这个构造函数,你猜到了,使用eval()函数。我的函数采用名称、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语句放在函数中时,函数在声明时会弹出未定义

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函数的工作原理理解不正确。欢迎任何意见和/或解决方案

问题在于,您正在
createWithEval
函数中运行
eval
,因此在
createWithEval
的范围之外不可用。纠正此问题的一种方法是使用
eval.apply(窗口[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))

eval.apply
不会改变任何事情。呃,对不起,我应该说清楚:使用
apply
本身确实会改变一件事情,但考虑到接收者的上下文很重要。不要通过
这个
窗口
或任何东西-这没关系。只需使用
eval.call(null,bdy)
(1,eval)(bdy)
。如果
createWithEval
将返回函数,则需要编写
var xtimesy=createWithEval(“xtimesy”,“x,y”,“return x*y”)使其可调用可能重复的?