Как это ключевое слово работает в node.js [duplicate]

Вы можете возвращать выходы и код возврата команд exec , токи могут содержать информацию, которая могла бы объяснить проблему ...

exec('my command', $output, $return);

27
задан Gökçer Gökdal 30 April 2017 в 14:35
поделиться

3 ответа

Вот несколько фундаментальных фактов, которые вы должны понять, чтобы прояснить ситуацию:

  • В коде верхнего уровня в модуле узла this эквивалентно module.exports. Это пустой объект, который вы видите.
  • Когда вы используете this внутри функции, значение this определяется заново перед каждым исполнением функции, и его значение определяется тем, как выполняется функция . Это означает, что два вызова одного и того же функционального объекта могут иметь разные значения this, если механизмы вызова различны (например, aFunction() против aFunction.call(newThis) против emitter.addEventListener("someEvent", aFunction); и т. Д.). В вашем случае aFunction() в нестрогом режиме запускается функция с this, установленная для глобального объекта.
  • Когда файлы JavaScript require d как модули узла, движок узла запускает код модуля внутри функции обертки. Эта функция обматывания модуля вызывается с this, установленным на module.exports. (Вспомните выше, функция может быть запущена со значением this.)

Таким образом, вы получаете разные значения this, потому что каждый this находится внутри другой функции: первая находится внутри созданной Узлом модуля-обертки, а вторая находится внутри aFunction.

41
ответ дан Community 16 August 2018 в 14:18
поделиться
  • 1
    Я думаю, что я также нашел код, где приходит module.export. В исходном коде module.js (node.js) используется javascript apply метод как return compiledWrapper.apply(self.exports, args);. Большое спасибо всем за помощь. – Gökçer Gökdal 31 March 2014 в 21:40

Чтобы понять это, вам нужно понять, что Node.js фактически переносит ваш код модуля в функцию, например

(function (exports, require, module, __filename, __dirname) {
    var test = function(){
        console.log('From test: '  + this);
    };
    console.log(this);
    test();
});

Подробное объяснение можно найти в этом ответе .


Теперь эта завернутая функция - это , которая действительно вызывается, как это

var args = [self.exports, require, self, filename, dirname];
return compiledWrapper.apply(self.exports, args);

Итак, this, на уровне модуля , фактически является объектом exports.

Вы можете подтвердить, что, подобно этому

console.log(this, this === module.exports);
// {} true
24
ответ дан Community 16 August 2018 в 14:18
поделиться
  • 1
    Я думаю, что я также нашел код, где приходит module.export. В исходном коде module.js (node.js) используется javascript apply метод как return compiledWrapper.apply(self.exports, args);. Большое спасибо всем за помощь. – Gökçer Gökdal 31 March 2014 в 21:40
  • 2
    Вероятно, стоит отметить, что test можно было бы назвать по-разному, установив this на что-то еще – Juan Mendes 17 June 2015 в 14:47
  • 3
    Из того, что я понимаю, вызов функции, такой как fn(), заставит this указывать на глобальный объект или null при использовании use strict, не имеет значения, что текущий this ... - это Node, отличный от браузер, когда дело доходит до настройки this? Я думаю, правильный ответ в том, что для глобального объекта установлено значение exports – Juan Mendes 17 June 2015 в 14:49
  • 4
    Подумайте, комментировать мой комментарий (и мой ответ?), Я думаю, что ваш ответ вводит в заблуждение, потому что значение this, в котором вызывается test (), не влияет на значение этого внутреннего теста (), это все о том, как он называется , Я хотел бы понять, если я что-то упустил – Juan Mendes 17 June 2015 в 15:08
  • 5
    Извините за исправление, но this указывает на global только в режиме REPL – Oleg 17 June 2015 в 15:24
  • 6
    global object in Node.js is the exports object - Неправильно. Каждый модуль будет иметь свой собственный объект exports. – thefourtheye 17 June 2015 в 16:02
  • 7
    @Curious Спасибо, вот почему я спросил, я проверил свой тест из командной строки – Juan Mendes 17 June 2015 в 17:04
  • 8
    @thefourtheye Я действительно собирал это из документации, означает ли это, что нет глобальных переменных? В моем примере выше, myGlobal не существует в другом модуле? – Juan Mendes 17 June 2015 в 17:05
  • 9
    Глобальные глобальные сети @JuanMendes существуют в узле, но в отличие от клиентской JS, вы должны получить доступ к объекту global. Например, global.myName = 'Mike'; будет отображаться во всех модулях через global.myName или только myName. Но var myName = 'Mike'; или myName = 'Mike' видны только в текущем модуле. Взгляните на документы – Oleg 17 June 2015 в 17:32
1
ответ дан Willem van der Veen 29 October 2018 в 12:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: