将字符串作为一段 HTML/javascript 代码执行
Execute a string as a piece of HTML/javascript code
所以,假设我在javascript中定义了一个字符串:
var s = "function();"
如果我知道字符串的值,我可以执行代码吗?
如果是,那么我可以在一个字符串中有多个命令吗?例如:
var k = "function(); a = a + 1;"
提前致谢
您可以使用
eval
,是的,将执行多个语句。但是,使用eval
通常是一个坏主意。在大多数情况下,您可能可以在没有eval
的情况下完成您尝试做的任何事情。
如果与用户提供的代码(例如表单或 URL 中的某些内容)一起使用,eval
可能会非常危险。它使您面临跨站点脚本 (XSS) 攻击。只是避免它是最好的做法,正如这个答案所提到的,在通过eval
之前清理输入根本不是直截了当的,而且非常容易出错。
使用 eval
的其他几个不太重要的问题是它使代码难以调试并且速度很慢。这使得浏览器很难(如果不是不可能的话)像优化其他代码一样对其进行优化和/或缓存。
更新
我很惊讶我在最初回答这个问题时忽略了提到这一点,但明确使用 eval
语句并不是可以在 JavaScript 中调用eval
的唯一方法。将代码而不是函数引用传递给setTimeout
或setInterval
将隐式评估该代码。
// This evals:
setTimeout("doSomething()", 1000);
// This does not eval:
setTimeout(doSomething, 1000); // also shorter :)
虽然与eval
不完全相同,但Function
构造函数也有类似的安全问题。
let xss = 'alert("XSS")';
// whatever is in the string passed to Function
// becomes the body of the function
let doSomething = new Function(xss);
document.querySelector('button').addEventListener('click', doSomething, false);
<button>Do Something</button>
与eval
一样,当使用字符串作为setTimeout
、setInterval
或Function
构造函数的输入时,应该小心,特别是当用户输入将被传递到它们中时。
另请参阅:
- 邪恶是怎样的
- 埃瓦尔不是邪恶的,只是被误解了
- 为什么使用 JavaScript eval 函数是个坏主意?(这里有几个很好的答案)
- 动态语言反击
您可以使用eval()
来计算/执行 JavaScript 代码/表达式:
var k = "var a = 0; alert(a); a = a + 1; alert(a);"
eval(k);
eval
函数将计算传递给它的字符串。它很慢。这是因为要评估的代码必须当场解析,这样会占用一些计算资源。
相关文章:
- 处理HTML字段集's大小
- Canvas+svg路径动画,在路径中的特定点暂停一段时间,然后继续
- 收集一段时间内的EMG数据.建议JS
- 将字符串作为一段 HTML/javascript 代码执行
- 使用 javascript 每隔一段时间在 html 上显示帖子数组中的某些帖子
- 在 android 的 webview 中嵌入一段 HTML 代码或 Javascript 脚本
- 如何获取单击元素的类值,并使用此值在 jquery 中最后一次出现此类之后放置一段 html 代码
- 如何从HTML页面的源代码中获取一段文本
- Javascript获取HTML块中的最后一段文本
- 一段html+javascript,用于查找输入中的数字是否为素数,然后显示结果
- 如何隐藏一段HTML而不删除它
- 使用if语句关闭html中的一段代码
- 每隔一段时间更新一个HTML标签
- 使用javascript/html从JSON结果中抓取一段数据
- 我需要循环一段HTML代码与php/javascript,建议
- 如何调用驻留在HTML文件中的一段javascript
- 用JQuery禁用Html按钮一段时间
- 我有一段html/javascript需要在新页面中打开,但我使用Wix.com
- 如何用页面上的另一段HTML替换一段HTML
- 车把:“capture"将一段HTML放入变量中