Javascript NodeJS:为什么要跳过函数?

Javascript NodeJS:为什么要跳过函数?,javascript,node.js,debugging,execution,Javascript,Node.js,Debugging,Execution,我不熟悉nodeJs,正在试图理解为什么在这个文件--app.js--中函数main()从未执行过 如果在函数之前添加console.log语句,则会执行该语句,但函数内部不会执行任何内容 我已经使用了调试器,可以肯定的是,该函数将被完全跳过 为什么会发生这种情况?是否有我忽略的节点组件 'use strict'; const sendEmail = require('./send-email'); module.exports = main; //console.log("This ge

我不熟悉nodeJs,正在试图理解为什么在这个文件--app.js--中函数main()从未执行过

如果在函数之前添加console.log语句,则会执行该语句,但函数内部不会执行任何内容

我已经使用了调试器,可以肯定的是,该函数将被完全跳过

为什么会发生这种情况?是否有我忽略的节点组件

'use strict';

const sendEmail = require('./send-email');

module.exports = main;

//console.log("This gets executed");

//this function never gets executed!
function main()
{
debugger
...some functionality...
}

您已在模块中定义了
main
,但未调用
main()
。如果这是您的全部代码,您需要在代码末尾添加
main()
以执行它。

您从不调用
main
函数

将函数视为一段代码,该代码被外包,并给出了一个名称。只要你不直呼它的名字,什么都不会发生

因此,您需要在代码中添加以下行:

main();
那就行了。(请注意,您应该在声明
main
函数后执行此操作。)

console.log
会自动执行,因为它不在函数中,但已经在顶层。函数的声明也是如此。这就是Node.js为创建此函数的原因,但您没有告诉它实际使用它

实际上,如果在声明之前调用
main
,由于JavaScript处理函数语句的方式,调用
main也会起作用,但我认为不这样做更好。使用
module.exports时也是如此,这也会以这种方式工作,但是如果在创建函数后使用它,我也会称之为更好的样式

因此,长话短说,您的代码应该如下所示:

'use strict';

const sendEmail = require('./send-email');

console.log("This gets executed");

function main()
{
  // ...
}

main();

module.exports = main;
这将为您运行
main
函数,并将其导出(如果您希望从另一个文件运行相同的函数,这将非常有用)

…加载模块并将
导出
的值分配给
发送电子邮件

这就是它所做的一切

exports
的值是一个函数。如果你想调用这个函数,那么你必须…调用它

sendEmail();

如何调用函数?如果
app.js
是您的输入脚本,Node.js不会使用定义执行时自动调用的
main
函数的模式。从第1行第1个字符开始的整个输入脚本是启动应用程序行为/逻辑的“主”代码。是否有将模块移动到末尾的原因?这只是个人风格。基本上,您可以将其放在文件中的任何位置,但我希望导出始终位于文件的底部。这背后的逻辑是:首先定义所有私有的,然后定义所有公共的,然后导出它们。但正如所说,这只是个人风格。
sendEmail();