Javascript 如何将';module.exports=foo';在定义foo之前工作?

Javascript 如何将';module.exports=foo';在定义foo之前工作?,javascript,node.js,Javascript,Node.js,我不会说我非常精通Node,甚至Javascript,但我已经看到了表单的几个模块 module.exports = foo; function foo() { ... } 现在,我可以看到它在这种情况下工作,但是当模块返回一个执行的函数时,我真的很困惑 module.exports = bar(); function bar() { ... } 这是什么魔法?函数在解析时定义,分配在运行时分配。有关更多信息,请参阅本文 简而言之,编译器进行2次传递。使用以下代码: var a

我不会说我非常精通Node,甚至Javascript,但我已经看到了表单的几个模块

module.exports = foo;

function foo() {
  ...
}
现在,我可以看到它在这种情况下工作,但是当模块返回一个执行的函数时,我真的很困惑

module.exports = bar();

function bar() {
  ...
}

这是什么魔法?

函数在解析时定义,分配在运行时分配。有关更多信息,请参阅本文

简而言之,编译器进行2次传递。使用以下代码:

var a = x;
function x( ) { }

在第一个过程中,var a和函数x在符号表中声明并可用(或其他形式,取决于解释器),然后编译器进行第二个过程,执行函数x对var a的赋值。在这个阶段,在任何时候(但限于语言规则),函数x都是已知的

函数在解析时定义,赋值在运行时分配。有关更多信息,请参阅本文

简而言之,编译器进行2次传递。使用以下代码:

var a = x;
function x( ) { }

在第一个过程中,var a和函数x在符号表中声明并可用(或其他形式,取决于解释器),然后编译器进行第二个过程,执行函数x对var a的赋值。在这个阶段,在任何时候(但限于语言规则),函数x都是已知的

可能是@Mathletics的复制品不,我理解它是什么,我不理解的是操作顺序。我看了那个问题,但它没有回答我想要的。@Mathletics我编辑了标题,以更准确地反映我的问题,并将其与提议的副本进一步区分开来。请考虑取消你的投票。啊,明白了。这就是所谓的提升。@Mathletics的可能复制不,我理解它是什么,我不理解的是操作顺序。我看了那个问题,但它没有回答我想要的。@Mathletics我编辑了标题,以更准确地反映我的问题,并将其与提议的副本进一步区分开来。请考虑取消你的投票。啊,明白了。那叫吊装。可能是重复的。谢谢你的回答。在我看到你最初的答案后,我会要求更多的澄清,但是你提供的链接基本上正是我想要的。再次感谢。@shortstuffsushi这通常被称为“功能提升”。如果你想用谷歌搜索它,可能会有帮助。谢谢你的回答。在我看到你最初的答案后,我会要求更多的澄清,但是你提供的链接基本上正是我想要的。再次感谢。@shortstuffsushi这通常被称为“功能提升”。如果你想用谷歌搜索它,可能会有帮助。