this
свойство функции устанавливается, когда функция вызывается и точками по умолчанию для объекта вызывающей функции, если значение не задано с помощью таких методов, как bind
, apply
или call
.
Стоит отметить, что модуль (эквивалент файла) в узле заворачивают в функции(), как это:
NativeModule.wrapper = [
‘(function (exports, require, module, __filename, __dirname) { ‘,
‘\n});’
];
Это означает, что все фрагменты кода ниже, на самом деле выполняются внутри этого обертка. См. Where are vars stored in Nodejs для получения более подробной информации.
console.log (это) внутри функции
Следующий код:
var apple = ‘red’; // private variable in the wrapper function
global.apple = ‘yellow’; // property on the global object
var foo = function() {
var apple = ‘green’;
console.log (this.apple);
}
foo();
возвращает yellow
, поскольку внутренняя функция не может получить доступ к значению каких-либо внешних функций и в случае таких this
Внутренние функции - это стандартное поведение this
по умолчанию для глобального объекта (объект окна в браузерах).
console.log (это) внутри объекта
Следующий код:
var apple = ‘red’; // private variable in the wrapper function
global.apple = ‘yellow’; // property on the global object
var myObject = {
orange: ‘orange’,
print: function() {
console.log (this.orange);
console.log (this.melon);
}}
myObject.print();
возвращает orange
и undefined
, потому что это myObject
вызывающему print
. Он возвращает undefined
по отношению к this.melon
, так как myObject
не имеет собственности с названием melon.
Консоль.войти (это) в рамках модуля
Команда console.log
это свойство на Node's глобального объекта со значением функции и, следовательно, можно было бы ожидать следующий код
global.apple = ‘yellow’;
global.console.apple = 'yellow';
console.log(this.apple);
для возврата yellow
в console.log()
это то же самое, что и global.console.log()
. Это означает, что глобальный объект вызывается console.log()
, поэтому вы ожидаете, что this
укажет либо global.apple
, либо global.console.apple
. Однако некоторые функции глобального объекта фактически выполняются в области модуля (см. Global objects), и в этой области разработчики узла решили установить значение this
объекту exports
, который передается как параметр для обертывания функции модуль узла.
Приведенный выше код поэтому возвращает undefined
, потому что exports
не имеет собственности с именем apple.
Узел модулей не запускается в глобальном масштабе. – Bergi
Спасибо @Bergi. Как бы вы это сформулировали тогда, когда console.log вызывается в файле вне любых функций, объектов и т. Д. Вы бы сказали, что он вызывается в «локальном контексте»? – rabbitco
Он известен как «область модуля». – Bergi