new Function
语法new Function
是 JavaScript 中一种创建函数对象的特殊方式,它允许通过字符串动态创建函数。
let func = new Function ([arg1[, arg2[, ...argN]], functionBody);
arg1, arg2, ... argN
:函数参数(可选)functionBody
:包含函数体的字符串// 创建无参数函数
let sayHi = new Function('console.log("Hello")');
sayHi(); // 输出: Hello
// 创建带参数的函数
let sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 3)); // 输出: 5
// 创建多参数函数
let multiply = new Function('x', 'y', 'z', 'return x * y * z');
console.log(multiply(2, 3, 4)); // 输出: 24
词法环境:使用 new Function
创建的函数,其 [[Environment]]
引用全局词法环境,而不是创建时的局部环境。因此它不能访问外部变量,只能访问全局变量。
let value = "test";
function getFunc() {
let value = "hello";
let func = new Function('console.log(value)');
return func;
}
getFunc()(); // 输出: test(全局变量),而不是 "hello"
动态执行:可以动态地从服务器接收代码并执行。
安全性:在生产环境中应谨慎使用,因为可能带来安全风险(如代码注入)。
eval
的区别eval
可以访问局部变量,而 new Function
不能new Function
创建的函数有明确的作用域隔离由于安全考虑,应避免使用不受信任的字符串来创建函数,这可能导致 XSS 攻击等安全问题。