eval和new Function使用介绍


`eval` 和 `new Function` 都是 JavaScript 中的函数,它们可以将字符串形式的代码执行成 JavaScript 代码。尽管它们在某些情况下非常有用,但它们的使用也伴随着安全风险和潜在的代码维护问题。下面是关于这两个函数的基本介绍:

### eval

`eval` 函数会计算并执行一个字符串中的 JavaScript 代码。这个字符串可以是表达式、语句或者语句序列。

**示例**:


let x = 10;
let y = 20;
let result = eval('x + y'); // 相当于执行 x + y,结果为 30
console.log(result);

**注意**:

- 使用 `eval` 时,如果执行的代码字符串包含来自不可信源的输入,可能会引入跨站脚本攻击(XSS)等安全风险。

- `eval` 会影响作用域链,因此它可能会访问或修改其作用域内的变量,这可能导致意外的副作用。

- `eval` 通常比直接执行代码要慢,因为它需要解析和执行字符串中的代码。

### new Function

`new Function` 构造函数创建了一个新的 `Function` 对象。与全局 `Function` 构造函数不同,`new Function` 不是在全局作用域中执行代码,而是在它自己的作用域中执行。

**示例**:


let x = 10;
let y = 20;
let add = new Function('a', 'b', 'return a + b;');
let result = add(x, y); // 调用 add 函数,相当于执行 a + b,其中 a 是 10,b 是 20,结果为 30
console.log(result);

**注意**:

- 使用 `new Function` 可以避免像 `eval` 那样影响全局作用域,因为它在自己的作用域中执行。

- `new Function` 同样存在安全风险,特别是当函数体中包含来自不可信源的输入时。

- `new Function` 在性能方面通常也不如直接执行的代码,因为它涉及到创建新函数对象和执行字符串中的代码。

### 总结

尽管 `eval` 和 `new Function` 在某些特定情况下非常有用,但通常建议尽量避免使用它们,特别是当涉及到执行不可信的代码时。在可能的情况下,应该寻找更安全、更清晰的替代方案。