eval()
是 JavaScript 中的一个全局函数,它能够执行传入的字符串作为 JavaScript 代码。
let result = eval('2 + 2');
console.log(result); // 输出: 4
eval()
接受一个字符串参数:
eval()
会计算该表达式eval()
会执行这些语句// 执行表达式
let x = 10;
let y = 20;
console.log(eval('x + y')); // 输出: 30
// 执行语句
eval('let z = 30; console.log(z);'); // 输出: 30
eval()
的执行环境取决于调用方式:
function test() {
let a = 1;
eval('let b = 2; console.log(a + b);'); // 输出: 3 (访问局部变量a)
let indirectEval = eval;
indirectEval('let c = 3; console.log(a + c);'); // 报错: a未定义
}
test();
eval()
存在严重的安全风险:
// 危险示例 - 永远不要这样使用!
let userInput = "alert('恶意代码!')";
eval(userInput); // 会执行用户提供的任意代码
在大多数情况下,应该避免使用 eval()
,可以考虑以下替代方案:
JSON 解析:
let jsonStr = '{"name": "John", "age": 30}';
let obj = JSON.parse(jsonStr); // 比 eval() 安全
Function 构造函数(比 eval 稍安全,但仍有风险):
let add = new Function('a', 'b', 'return a + b');
console.log(add(2, 3)); // 输出: 5
直接编写代码:大多数情况下,你不需要动态执行代码字符串。
eval()
'use strict'
)可以限制 eval()
的一些危险行为eval()
执行来自不可信来源的字符串'use strict';
eval('let x = 2; console.log(x);'); // 在严格模式下,eval 不会泄漏变量到外部作用域
console.log(x); // 报错: x未定义
总之,eval()
是一个强大但危险的函数,在现代 JavaScript 开发中应谨慎使用。