程序中如何使用eval
How to use eval in the program
我正在开发一个 javascript 程序 -- 图形计算器。用户在文本字段中输入方程式(如 x*x+2*x ),按下 "get answer" 按钮,应该会得到一个图表。如果我在函数 f(x) 中写一个表达式,比如 "Math.sin(x)" 它工作得很好,但是当我尝试使用 eval 方法评估用户代码时,程序停止工作。我是 javascript 的新手。任何帮助,将不胜感激!
JavaScript代码
//vars
var points = "";
var input = document.querySelector("#input");
var evaluate = document.querySelector("#evaluate");
evaluate.addEventListener('click', function() {
document.body.appendChild(makeSVG(svgData));
});
function f(x) {
return eval('(function() { x=' + x + ';' + input.value + ';}())');
}
function getPoints() {
for (var i = -10; i < 10.0; i += 0.25) {
var x = 10 * i + 100;
var y = -10 * f(i) + 100;
points += "" + x + "," + y + " ";
}
return points;
}
var svgData = [{
type: 'svg',
data: {
viewBox: "0 0 500 200"
}
},
{
type: 'polyline',
data: {
fill: "none",
stroke: "black",
strokeWidth: "1",
points: getPoints()
}
},
];
function getNode(n, v) {
n = document.createElementNS("http://www.w3.org/2000/svg", n);
for (var p in v) {
n.setAttributeNS(null, p.replace(/[A-Z]/g, function(m, p, o, s) {
return "-" + m.toLowerCase();
}), v[p]);
}
return n
}
function makeSVG(data) {
var result;
data.forEach(
function(elem, index, array) {
if (index)
result.appendChild(getNode(elem.type, elem.data));
else
result = getNode(elem.type, elem.data);
}
);
return result;
}
<!DOCTYPE html>
<html>
<head>
<title>Graphing Calculator</title>
</head>
<body>
<h1>Graphing Calculator</h1>
<form>
<input id="input" type="text">
<button id="evaluate" type="button">Get answer</button>
</form>
<script type="text/javascript" src="code.js"></script>
</body>
</html>
首先,请注意 eval
应始终谨慎使用,因为它允许根据用户输入执行任意代码。在你的情况下,它不会真的有害,因为它只允许用户在他自己的页面上执行代码。
您的 f()
函数包含一个 eval
,其中包含一个不必要的自执行函数。而且,这个自执行函数没有return任何东西。试试这个:
function f(x) {
return eval(input.value);
}
f()
中不需要 IIFE。只需调用 eval(x)
。它会在f()
的范围内执行,所以它可以访问x
.
另一个问题是您在初始化 svgData
时调用 getPoints()
,但用户尚未填写输入字段。您需要在点击处理程序中执行此操作。
//vars
var points = "";
var input = document.querySelector("#input");
var evaluate = document.querySelector("#evaluate");
evaluate.addEventListener('click', function() {
svgData[1].data.points = getPoints();
document.body.appendChild(makeSVG(svgData));
});
function f(x) {
return eval(input.value);
}
function getPoints() {
for (var i = -10; i < 10.0; i += 0.25) {
var x = 10 * i + 100;
var y = -10 * f(i) + 100;
points += "" + x + "," + y + " ";
}
return points;
}
var svgData = [{
type: 'svg',
data: {
viewBox: "0 0 500 200"
}
},
{
type: 'polyline',
data: {
fill: "none",
stroke: "black",
strokeWidth: "1",
points: null
}
},
];
function getNode(n, v) {
n = document.createElementNS("http://www.w3.org/2000/svg", n);
for (var p in v) {
n.setAttributeNS(null, p.replace(/[A-Z]/g, function(m, p, o, s) {
return "-" + m.toLowerCase();
}), v[p]);
}
return n
}
function makeSVG(data) {
var result;
data.forEach(
function(elem, index, array) {
if (index)
result.appendChild(getNode(elem.type, elem.data));
else
result = getNode(elem.type, elem.data);
}
);
return result;
}
<!DOCTYPE html>
<html>
<head>
<title>Graphing Calculator</title>
</head>
<body>
<h1>Graphing Calculator</h1>
<form>
<input id="input" type="text">
<button id="evaluate" type="button">Get answer</button>
</form>
<script type="text/javascript" src="code.js"></script>
</body>
</html>
我正在开发一个 javascript 程序 -- 图形计算器。用户在文本字段中输入方程式(如 x*x+2*x ),按下 "get answer" 按钮,应该会得到一个图表。如果我在函数 f(x) 中写一个表达式,比如 "Math.sin(x)" 它工作得很好,但是当我尝试使用 eval 方法评估用户代码时,程序停止工作。我是 javascript 的新手。任何帮助,将不胜感激! JavaScript代码
//vars
var points = "";
var input = document.querySelector("#input");
var evaluate = document.querySelector("#evaluate");
evaluate.addEventListener('click', function() {
document.body.appendChild(makeSVG(svgData));
});
function f(x) {
return eval('(function() { x=' + x + ';' + input.value + ';}())');
}
function getPoints() {
for (var i = -10; i < 10.0; i += 0.25) {
var x = 10 * i + 100;
var y = -10 * f(i) + 100;
points += "" + x + "," + y + " ";
}
return points;
}
var svgData = [{
type: 'svg',
data: {
viewBox: "0 0 500 200"
}
},
{
type: 'polyline',
data: {
fill: "none",
stroke: "black",
strokeWidth: "1",
points: getPoints()
}
},
];
function getNode(n, v) {
n = document.createElementNS("http://www.w3.org/2000/svg", n);
for (var p in v) {
n.setAttributeNS(null, p.replace(/[A-Z]/g, function(m, p, o, s) {
return "-" + m.toLowerCase();
}), v[p]);
}
return n
}
function makeSVG(data) {
var result;
data.forEach(
function(elem, index, array) {
if (index)
result.appendChild(getNode(elem.type, elem.data));
else
result = getNode(elem.type, elem.data);
}
);
return result;
}
<!DOCTYPE html>
<html>
<head>
<title>Graphing Calculator</title>
</head>
<body>
<h1>Graphing Calculator</h1>
<form>
<input id="input" type="text">
<button id="evaluate" type="button">Get answer</button>
</form>
<script type="text/javascript" src="code.js"></script>
</body>
</html>
首先,请注意 eval
应始终谨慎使用,因为它允许根据用户输入执行任意代码。在你的情况下,它不会真的有害,因为它只允许用户在他自己的页面上执行代码。
您的 f()
函数包含一个 eval
,其中包含一个不必要的自执行函数。而且,这个自执行函数没有return任何东西。试试这个:
function f(x) {
return eval(input.value);
}
f()
中不需要 IIFE。只需调用 eval(x)
。它会在f()
的范围内执行,所以它可以访问x
.
另一个问题是您在初始化 svgData
时调用 getPoints()
,但用户尚未填写输入字段。您需要在点击处理程序中执行此操作。
//vars
var points = "";
var input = document.querySelector("#input");
var evaluate = document.querySelector("#evaluate");
evaluate.addEventListener('click', function() {
svgData[1].data.points = getPoints();
document.body.appendChild(makeSVG(svgData));
});
function f(x) {
return eval(input.value);
}
function getPoints() {
for (var i = -10; i < 10.0; i += 0.25) {
var x = 10 * i + 100;
var y = -10 * f(i) + 100;
points += "" + x + "," + y + " ";
}
return points;
}
var svgData = [{
type: 'svg',
data: {
viewBox: "0 0 500 200"
}
},
{
type: 'polyline',
data: {
fill: "none",
stroke: "black",
strokeWidth: "1",
points: null
}
},
];
function getNode(n, v) {
n = document.createElementNS("http://www.w3.org/2000/svg", n);
for (var p in v) {
n.setAttributeNS(null, p.replace(/[A-Z]/g, function(m, p, o, s) {
return "-" + m.toLowerCase();
}), v[p]);
}
return n
}
function makeSVG(data) {
var result;
data.forEach(
function(elem, index, array) {
if (index)
result.appendChild(getNode(elem.type, elem.data));
else
result = getNode(elem.type, elem.data);
}
);
return result;
}
<!DOCTYPE html>
<html>
<head>
<title>Graphing Calculator</title>
</head>
<body>
<h1>Graphing Calculator</h1>
<form>
<input id="input" type="text">
<button id="evaluate" type="button">Get answer</button>
</form>
<script type="text/javascript" src="code.js"></script>
</body>
</html>