解析Node.js模块中的JavaScript代码

解析Node.js模块中的JavaScript代码,javascript,node.js,express,node-modules,Javascript,Node.js,Express,Node Modules,假设我正在使用上述代码。我很好奇,如果我放置第一行代码,为什么它仍然运行: // =============================================================================== // Auth // =============================================================================== const admin = require('firebase-admin'

假设我正在使用上述代码。我很好奇,如果我放置第一行代码,为什么它仍然运行:

// ===============================================================================
// Auth
// ===============================================================================
const admin = require('firebase-admin');     //what happens if i move this line
admin.initializeApp();                       //and this line

module.exports = function(app) {

//to this line
//and this line?

  app.post('/login', function(req, res) {
    const token = req.body.token;

    console.log('token sent: ' + token);

    admin
      .auth()
      .verifyIdToken(token)
      .then(result => {
        console.log('verifyIdToken result: ' + result);
      });

    res.send({ valid: 'havent programmed this yet' });
  });
};

从module.exports导出的匿名函数的外部到内部?我真糊涂!此函数是否在其模块之外寻找以获取此作用域,以及从module.exports内而不是从module.exports外声明此admin const有什么区别?

要了解发生了什么,您需要了解Javascript闭包和模块模式

当这两行在module.exports之外时,它们是全局范围的一部分,因此对您的模块可见。这是因为在任何函数、块或模块作用域之外定义的变量在文件中具有
全局作用域

当您将其移动到模块内部时,它们将成为功能/模块范围的一部分,因此再次可见

您可以阅读这篇古老但相关的文章,以便更好地理解。

要了解发生了什么,您需要了解Javascript闭包和模块模式

当这两行在module.exports之外时,它们是全局范围的一部分,因此对您的模块可见。这是因为在任何函数、块或模块作用域之外定义的变量在文件中具有
全局作用域

当您将其移动到模块内部时,它们将成为功能/模块范围的一部分,因此再次可见

您可以阅读这篇古老但相关的文章,以便更好地理解。

在这里使用“全局范围”一词时,我会非常小心。更好的术语是
模块范围
导入范围
imo。全局范围指的是
窗口
过程
对象之类的内容。我在这里会小心使用“全局范围”一词。更好的术语是
模块范围
导入范围
imo。例如,全局范围将指
窗口
过程
对象之类的内容。
const admin = require('firebase-admin');
admin.initializeApp();