Javascript 如何在程序中使用eval

Javascript 如何在程序中使用eval,javascript,html,eval,Javascript,Html,Eval,我正在开发一个javascript程序——图形计算器。用户在文本字段中输入一个像x*x+2*x这样的等式,按下获取答案按钮,应该会得到一个图形。如果我在函数fx中写一个表达式,比如Math.sinx,效果很好,但是当我尝试使用eval方法计算用户代码时,程序停止工作。我是javascript新手。任何帮助都将不胜感激! JavaScript代码 //瓦尔斯 var点=; var输入=document.queryselector输入; var evaluate=document.querysel

我正在开发一个javascript程序——图形计算器。用户在文本字段中输入一个像x*x+2*x这样的等式,按下获取答案按钮,应该会得到一个图形。如果我在函数fx中写一个表达式,比如Math.sinx,效果很好,但是当我尝试使用eval方法计算用户代码时,程序停止工作。我是javascript新手。任何帮助都将不胜感激! JavaScript代码

//瓦尔斯 var点=; var输入=document.queryselector输入; var evaluate=document.queryselectoreevaluate; evaluate.addEventListener'click'函数{ document.body.appendChildmakeSVGsvgData; }; 函数fx{ 返回eval'function{x='+x+';'+input.value+';}'; } 函数获取点{ 对于变量i=-10;i<10.0;i+=0.25{ var x=10*i+100; 变量y=-10*fi+100; 点数+=+x+,+y+; } 返回点; } var svgData=[{ 键入:“svg”, 数据:{ 视图框:0 500 200 } }, { 类型:“多段线”, 数据:{ 填充:无, 笔画:黑色, 冲程宽度:1, 积分:getPoints } }, ]; 函数getNoden,v{ n=document.createElementshttp://www.w3.org/2000/svgN 对于v中的var p{ n、 setAttributesNull,p.replace/[A-Z]/g,functionm,p,o,s{ 返回-+m.toLowerCase; },v[p]; } 返回n } 函数makeSVGdata{ var结果; data.forEach functionelem、索引、数组{ 如果索引 result.appendChildgetNodeelem.type,elem.data; 其他的 结果=getNodeelem.type,elem.data; } ; 返回结果; } 图形计算器 图形计算器 得到答案 首先,请注意,应始终小心使用eval,因为它允许从用户输入执行任意代码。在您的情况下,它不会真的有害,因为它只允许用户在自己的页面上执行代码

f函数包含一个eval,其中包含一个不必要的自执行函数。此外,这个自执行函数不返回任何内容。请尝试以下方法:

function f(x) {
  return eval(input.value);
}
首先,请注意,应始终小心使用eval,因为它允许从用户输入执行任意代码。在您的情况下,它不会真的有害,因为它只允许用户在自己的页面上执行代码

f函数包含一个eval,其中包含一个不必要的自执行函数。此外,这个自执行函数不返回任何内容。请尝试以下方法:

function f(x) {
  return eval(input.value);
}

没有必要在f生活。打电话给evalx。它将在f的范围内执行,因此它可以访问x

另一个问题是,在初始化svgData时调用getPoints,但用户尚未填写输入字段。您需要在单击处理程序中执行此操作

//瓦尔斯 var点=; var输入=document.queryselector输入; var evaluate=document.queryselectoreevaluate; evaluate.addEventListener'click'函数{ svgData[1].data.points=getPoints; document.body.appendChildmakeSVGsvgData; }; 函数fx{ 返回evalinput.value; } 函数获取点{ 对于变量i=-10;i<10.0;i+=0.25{ var x=10*i+100; 变量y=-10*fi+100; 点数+=+x+,+y+; } 返回点; } var svgData=[{ 键入:“svg”, 数据:{ 视图框:0 500 200 } }, { 类型:“多段线”, 数据:{ 填充:无, 笔画:黑色, 冲程宽度:1, 点数:空 } }, ]; 函数getNoden,v{ n=document.createElementshttp://www.w3.org/2000/svgN 对于v中的var p{ n、 setAttributesNull,p.replace/[A-Z]/g,functionm,p,o,s{ 返回-+m.toLowerCase; },v[p]; } 返回n } 函数makeSVGdata{ var结果; data.forEach functionelem、索引、数组{ 如果索引 result.appendChildgetNodeelem.type,elem.data; 其他的 结果=getNodeelem.type,elem.data; } ; 返回结果; } 图形计算器 图形计算器 得到答案
没有必要在f生活。打电话给evalx。它将在f的范围内执行,因此它可以访问x

另一个问题是,在初始化svgData时调用getPoints,但用户尚未填写输入字段。您需要在单击处理程序中执行此操作

//瓦尔斯 var点=; var输入=document.queryselector输入; var evaluate=document.queryselectoreevaluate; evaluate.addEventListener'click'函数{ svgData[1].data.points=getPoints; document.body.appendChildmakeSVGsvgData; }; 函数fx{ 返回evalinput.value; } 函数获取点{ 对于变量i=-10;i<10.0;i+=0.25{ var x=10*i+100; 变量y=-10*fi+100; 点数+=+x+,+y+; } 返回点; } var svgData=[{ 键入:“svg”, 数据:{ 视图框:0 500 200 } }, { 类型:“多段线”, 数据:{ 填充:无, 笔画:黑色, 冲程宽度:1, 点数:空 } }, ]; 函数getNoden,v{ n=document.createElementshttp://www.w3.org/2000/svgN 法罗群岛 v中的r变量p{ n、 setAttributesNull,p.replace/[A-Z]/g,functionm,p,o,s{ 返回-+m.toLowerCase; },v[p]; } 返回n } 函数makeSVGdata{ var结果; data.forEach functionelem、索引、数组{ 如果索引 result.appendChildgetNodeelem.type,elem.data; 其他的 结果=getNodeelem.type,elem.data; } ; 返回结果; } 图形计算器 图形计算器 得到答案
您收到了什么错误消息?此外,在f中不需要IIFE。IIFE没有return语句。起初我考虑eval'x='+x+';'+expressionFromTextField,但有人告诉我eval方法应该有括号,所以这分散了我的注意力,我重写了eval to函数。在EclipseIDE中,我没有得到任何错误,程序只是没有显示图形。您得到了什么错误消息?此外,在f中不需要IIFE。IIFE没有return语句。起初我考虑eval'x='+x+';'+expressionFromTextField,但有人告诉我eval方法应该有括号,所以这分散了我的注意力,我重写了eval to函数。在EclipseIDE中,我没有得到任何错误,程序只是没有显示图形,谢谢您的快速响应!我的程序将x值从for循环传递给函数,eval应该返回每个x的y值。如何将x包含在评估方法中?它包含在我的解决方案中。eval可以访问包含xThank you的f执行上下文!但是当我执行程序的时候,我仍然没有得到一个图形。我得到的只是一个接一个的空白。当我直接向eval写一个表达式时,我得到了一个图,但当我使用input.value时,我什么也得不到。你应该检查一下你的代码,它实际上没有意义。当您构建svgData时,您正在调用getPoints,在用户可以键入任何输入之前多次调用f。是的,我确实遇到了这个问题。非常感谢你的帮助!感谢您的快速回复!我的程序将x值从for循环传递给函数,eval应该返回每个x的y值。如何将x包含在评估方法中?它包含在我的解决方案中。eval可以访问包含xThank you的f执行上下文!但是当我执行程序的时候,我仍然没有得到一个图形。我得到的只是一个接一个的空白。当我直接向eval写一个表达式时,我得到了一个图,但当我使用input.value时,我什么也得不到。你应该检查一下你的代码,它实际上没有意义。当您构建svgData时,您正在调用getPoints,在用户可以键入任何输入之前多次调用f。是的,我确实遇到了这个问题。非常感谢你的帮助!非常感谢。我已经尝试过修改这段代码,但是当我执行程序时,我仍然没有得到一个图表。每次点击按钮后,我得到的只是一个接一个的空白。当我将表达式直接写入eval时,会得到一个图,但当我使用input.value时,我什么也得不到初始化svgData时调用getPoints,而不是用户单击按钮时。那么input.value为空。谢谢!我已经尝试过修改这段代码,但是当我执行程序时,我仍然没有得到一个图表。每次点击按钮后,我得到的只是一个接一个的空白。当我将表达式直接写入eval时,会得到一个图,但当我使用input.value时,我什么也得不到初始化svgData时调用getPoints,而不是用户单击按钮时。input.value则为空。