节点模块执行范围
Node modules scope of execution
我是 node 的新手,这个问题与 node 模块的内部工作有关。
当我们需要一个模块时,它应该被加载并 运行 在需要它的主文件的上下文中(我们 运行 从控制台使用 node 命令)。因此,由于词法范围规则,在此上下文中定义的所有函数(需要的节点模块)都应该可以访问主模块中的所有变量,但事实并非如此。例如,自定义路由模块无权访问应用程序实例,除非我们明确传递它。
那么这些模块是在某个孤立的范围内执行的吗?
模块在相同的 v8 上下文中执行,但它们是这样做的 using vm.runInThisContext()
. The documentation for this function 告诉您正在执行的代码 没有 访问本地范围(就像 eval()
一样),但是 可以访问 global
变量。因此,在大多数情况下,您可以将其视为一个单独的上下文(例如,无法访问局部变量、函数等),尽管从技术上讲它不是。
对于您的 HTTP 路由的特定用例,通常项目将传入 app
对象(此处假设为 Express)或将导出父脚本安装在某个路径的 Router 实例。
我是 node 的新手,这个问题与 node 模块的内部工作有关。
当我们需要一个模块时,它应该被加载并 运行 在需要它的主文件的上下文中(我们 运行 从控制台使用 node 命令)。因此,由于词法范围规则,在此上下文中定义的所有函数(需要的节点模块)都应该可以访问主模块中的所有变量,但事实并非如此。例如,自定义路由模块无权访问应用程序实例,除非我们明确传递它。
那么这些模块是在某个孤立的范围内执行的吗?
模块在相同的 v8 上下文中执行,但它们是这样做的 using vm.runInThisContext()
. The documentation for this function 告诉您正在执行的代码 没有 访问本地范围(就像 eval()
一样),但是 可以访问 global
变量。因此,在大多数情况下,您可以将其视为一个单独的上下文(例如,无法访问局部变量、函数等),尽管从技术上讲它不是。
对于您的 HTTP 路由的特定用例,通常项目将传入 app
对象(此处假设为 Express)或将导出父脚本安装在某个路径的 Router 实例。