Разбор кода JavaScript в модуле Node.js

// ===============================================================================
// 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' });
  });
};

Допустим, я работаю с приведенным выше кодом. Мне любопытно, почему он все еще работает, если я размещаю первые строки кода:

const admin = require('firebase-admin');
admin.initializeApp(); 

снаружи анонимной функции, которую module.exports внутри нее? Я так растерялся! Выходит ли эта функция за пределы своего модуля, чтобы захватить эту область, и в чем разница в объявлении этого admin const внутри module.exports, а не за его пределами?


person Community    schedule 27.11.2019    source источник


Ответы (1)


Чтобы понять, что происходит, вам нужно понять закрытие Javascript и шаблон модуля.

Когда две строки находятся за пределами module.exports, они являются частью глобальной области видимости и, следовательно, visible для вашего модуля. Это связано с тем, что переменные, определенные вне какой-либо функции, блока или модуля, имеют global scope внутри файла.

Когда вы перемещаете его внутри модуля, они становятся частью области видимости функции/модуля и, следовательно, снова visible.

Вы можете прочитать эту старую, но актуальную статью, чтобы лучше понять. https://www.joezimjs.com/javascript/javascript-closures-and-the-module-pattern/

person ArrowHead    schedule 27.11.2019
comment
Я был бы осторожен с использованием слова глобальная область здесь. Лучшим термином будет module scope или import scope IMO. Глобальная область действия будет относиться к таким вещам, как, например, объекты window и process. - person jmkmay; 27.11.2019