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