Вы можете возвращать выходы и код возврата команд exec , токи могут содержать информацию, которая могла бы объяснить проблему ...
exec('my command', $output, $return);
Вот несколько фундаментальных фактов, которые вы должны понять, чтобы прояснить ситуацию:
this
эквивалентно module.exports
. Это пустой объект, который вы видите. this
внутри функции, значение this
определяется заново перед каждым исполнением функции, и его значение определяется тем, как выполняется функция . Это означает, что два вызова одного и того же функционального объекта могут иметь разные значения this
, если механизмы вызова различны (например, aFunction()
против aFunction.call(newThis)
против emitter.addEventListener("someEvent", aFunction);
и т. Д.). В вашем случае aFunction()
в нестрогом режиме запускается функция с this
, установленная для глобального объекта. require
d как модули узла, движок узла запускает код модуля внутри функции обертки. Эта функция обматывания модуля вызывается с this
, установленным на module.exports
. (Вспомните выше, функция может быть запущена со значением this
.) Таким образом, вы получаете разные значения this
, потому что каждый this
находится внутри другой функции: первая находится внутри созданной Узлом модуля-обертки, а вторая находится внутри aFunction
.
Чтобы понять это, вам нужно понять, что 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
apply
метод как return compiledWrapper.apply(self.exports, args);
. Большое спасибо всем за помощь.
– Gökçer Gökdal
31 March 2014 в 21:40
test
можно было бы назвать по-разному, установив this
на что-то еще
– Juan Mendes
17 June 2015 в 14:47
fn()
, заставит this
указывать на глобальный объект или null при использовании use strict
, не имеет значения, что текущий this
... - это Node, отличный от браузер, когда дело доходит до настройки this
? Я думаю, правильный ответ в том, что для глобального объекта установлено значение exports
– Juan Mendes
17 June 2015 в 14:49
this
указывает на global
только в режиме REPL
– Oleg
17 June 2015 в 15:24
global object in Node.js is the exports object
- Неправильно. Каждый модуль будет иметь свой собственный объект exports
.
– thefourtheye
17 June 2015 в 16:02
global
. Например, global.myName = 'Mike';
будет отображаться во всех модулях через global.myName
или только myName
. Но var myName = 'Mike';
или myName = 'Mike'
видны только в текущем модуле. Взгляните на документы
– Oleg
17 June 2015 в 17:32
apply
метод какreturn compiledWrapper.apply(self.exports, args);
. Большое спасибо всем за помощь. – Gökçer Gökdal 31 March 2014 в 21:40