You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么JavaScript中的new Function无法访问局部变量?

为什么JavaScript中的new Function无法访问局部变量?

这问题我刚接触JavaScript闭包的时候也踩过一模一样的坑!其实核心原因在于new Function()创建函数的机制,和我们平时写的嵌套函数完全不是一回事。

先回忆下正常闭包的逻辑:当你在一个函数内部定义另一个函数(比如下面这种写法),这个嵌套函数会捕获当前的词法作用域,所以能访问外层函数的局部变量:

function outer() {
  let x = 10;
  return function() { return x; }; // 普通嵌套函数
}
const fn = outer();
console.log(fn()); // 输出10,正常闭包行为

但new Function()就不一样了——它创建的函数,词法作用域绑定的是全局作用域,而不是它被调用时所在的局部作用域!不管你在哪个函数里用new Function()生成函数,这个新函数都只能访问全局变量、自己的参数和内部定义的变量,完全拿不到外层函数的局部变量。

回到你的代码:

function outer() {
  let x = 10;
  return new Function("return x;");
}
const fn = outer();
console.log(fn()); // 报错ReferenceError: x is not defined

这里的fn是new Function生成的,它调用时会去全局作用域找x,但outer里的x是局部变量,根本不在全局,自然就找不到了。

你可以做个小测试验证这点:如果把x改成全局变量,new Function生成的函数就能正常访问了:

let x = 10; // 全局变量
function outer() {
  return new Function("return x;");
}
const fn = outer();
console.log(fn()); // 输出10

说白了,new Function是运行时从字符串动态编译生成的函数,它的作用域规则和静态定义的嵌套函数完全不同,静态函数在定义时就绑定了当前的词法环境,而new Function直接跳过了局部作用域,只认全局。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:15:30