为什么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
相关产品推荐
相关产品推荐

