阅读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的文件执行此示例时,此示例可能无法正常工作的可能原因是什么?
答案 0 :(得分:10)
在Node REPL中,您键入代码的词法位置为顶层,相当于在浏览器中的<script>
标签顶部键入内容。
在顶层用var
定义的变量将分配给全局对象。因此,在Node的REPL和浏览器中,您的
var x = "bar";
将x
分配给全局对象。
但是,相反,当您从文件中运行代码时,例如node bar.js
,则运行的代码位于模块中-它是< em> not 不在顶层,因此在此类脚本的顶层声明的变量不会分配给全局对象。
在顶层创建的函数是全局函数,因此它只能按词法“查看”在顶层定义的变量。因此,当在Node中将代码作为文件运行时,由于运行的代码范围不是最高级别,因此创建的函数在任何地方都看不到x
,因此将产生ReferenceError。