eval()读取函数参数有多糟糕
How bad is eval() to read function parameter
我使用Hopscotch在我的网站上进行导游。现在,您必须创建一个JS对象,该对象将作为调用startTour()函数的参数,该函数将启动Tour。在本例中,通过单击.hopscotch-start链接可以开始游览。
HTML:
<a href="#" class="hopscotch-start" data-name="x">Start tour</a>
JS:
var x = {id: "tour1", steps: [{title: "the title",....}]};
$("a.hopscotch-start").click(function (e) {
e.preventDefault();
hopscotch.startTour(eval($(this).data('name'))); // -> startTour(x);
return false;
}
这到底有多糟糕?我知道eval是"慢"的,但它可以让我灵活地只使用一个通用的点击代码,而不再为此烦恼。实际的安全风险是什么(如果有的话)?这样做会大大降低代码的速度(考虑到代码只是读取要作为变量解析的字符串)。
感谢您的反馈-除了eval之外,任何其他实现相同目标的解决方案都是受欢迎的。
如果有任何东西以任何方式修改了属性的值,那么您现在已经从服务器执行了任意JavaScript。
真正的问题是:为什么
如果使用对象作为查找,则不需要eval
:
var data = {
x: {...},
y: {...},
...
};
$("a.hopscotch-start").click(function (e) {
e.preventDefault();
hopscotch.startTour(data[$(this).data('name')]);
}
或者,只在属性本身中内联数据可能是有意义的:
HTML:<a href="#" class="hopscotch-start" data-hopscotch='{"id":"tour1","steps":[{"title":"the title",...}...]'>Start tour</a>
JS:$("a.hopscotch-start").click(function (e) {
e.preventDefault();
hopscotch.startTour($(this).data('hopscotch'));
}
为什么不创建一个对象并通过键获取它?它将更快更安全:
var tours = {
x: {id: "tour1", steps: [{title: "the title",....}]},
y: {id: "tour2", steps: [{title: "the title",....}]}
}
$("a.hopscotch-start").click(function (e) {
e.preventDefault();
hopscotch.startTour(tours[$(this).data('name')]); // -> startTour(x);
return false;
}
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- AngularJS:我可以跳过函数参数回调吗
- 函数未将值作为参数传递
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 为什么不'我们在javascript中使用函数参数的数据类型
- 你好,这是测试用例,我必须在函数中传递n个参数
- JavaScript - 多参数函数,它是多个图像库的字符串
- 如何从两个参数函数返回随机整数
- 以无点风格在Ramda中编写一个无参数函数
- JS:将单参数函数转换为可链接函数
- 正则表达式类似于Javascript中的参数函数
- 将 $' 值传递给替换的关联参数函数
- "这个“;在参数函数中
- 如何向jquery插件发送参数函数
- 将参数函数Node.js从一个js传递到另一个js
- 如何在javascript参数函数中传递PHP post方法字符串
- 装饰 Javascript Promise.then 以便参数函数接收附加参数
- 正在分析setInterval ID'是的's参数函数
- 如何根据一个参数函数计算年龄
- 对象参数/函数和/或三元运算符混淆