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

sho*_*shi 0 javascript node.js

我不会声称我非常精通Node,甚至是Javascript,但我已经看到了几个模块的形式

module.exports = foo;

function foo() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以看到这种情况可能在这种情况下有效,但当模块返回一个被执行的函数时,我真的很困惑.

module.exports = bar();

function bar() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这巫术是什么?

Pol*_*ity 5

函数在分析时定义,分配在运行时分配.有关更多信息,请参阅此文章http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/.

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

var a = x;
function x( ) { }
Run Code Online (Sandbox Code Playgroud)

在第一遍中,var a和function x被声明并在符号表中可用(或者取决于解释器的其他形式),之后编译器进行第二次传递,执行函数x的赋值以及var a.在这个阶段,在任何时候(但仅限于语言规则),函数x是已知的.

  • @shortstuffsushi这通常被称为"功能提升".如果你想谷歌它可能会有所帮助. (3认同)