尝试访问Function构造函数内部的变量时出现ReferrenceError

时间:2020-08-30 22:38:28

标签: javascript node.js

阅读mdn文档,了解Function构造函数和function声明之间的区别。此处指定的示例在浏览器上以及在node.js repl上均可使用,但是在尝试通过文件进行操作时,node.js进程因该错误而崩溃

ReferenceError: x is not defined

这是程序

var x = "bar";

function test() {
    var x = "baz";
    return new Function("return x;");
}

var t = test();
console.log(t());

从带有node.js的文件执行此示例时,此示例可能无法正常工作的可能原因是什么?

1 个答案:

答案 0 :(得分:10)

在Node REPL中,您键入代码的词法位置为顶层,相当于在浏览器中的<script>标签顶部键入内容。

在顶层用var定义的变量将分配给全局对象。因此,在Node的REPL和浏览器中,您的

var x = "bar";

x分配给全局对象。

但是,相反,当您从文件中运行代码时,例如node bar.js,则运行的代码位于模块中-它是< em> not 不在顶层,因此在此类脚本的顶层声明的变量不会分配给全局对象。

在顶层创建的函数是全局函数,因此它只能按词法“查看”在顶层定义的变量。因此,当在Node中将代码作为文件运行时,由于运行的代码范围不是最高级别,因此创建的函数在任何地方都看不到x,因此将产生ReferenceError。