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