Описанное поведение является естественным для Node REPL, но не для кода, который оценивается в модулях. Переменные в области видимости модуля не попадают в глобальные, потому что они определены в область видимости модуля , это относится как к var
, так и к const
. Вот что произойдет в модуле Node:
const myconstant = 1;
var myvariable = 2;
console.log(global.myconstant) // undefined
console.log(global.myvariable) // undefined
Причина, по которой это происходит в REPL, заключается в том, что код оценивается в глобальной области видимости. Описанное поведение может быть воспроизведено в области видимости модуля с косвенной eval
:
(0, eval)(`
const myconstant = 1;
var myvariable = 2;
`);
console.log(global.myconstant) // undefined
console.log(global.myvariable) // 2
Это разница между var
и переменными в области блока (const
и т. Д.). При определении в глобальной области действия var
приводит к определению свойства глобальной переменной (global
в узле), тогда как const
- нет.
Если целью является определение глобального, оно должно быть определено как свойство:
global.myconstant = 1;
global.myvariable = 2;
Если необходимо определить глобальную переменную, которая не будет переназначена, следует использовать дескриптор (как уже объясняется в другом ответе):
Object.defineProperty(global, 'myconstant', {
value: 1,
configurable: false,
writable: false
});
Использование глобалов для локальных целей обычно не рекомендуется, особенно в таких модульных средах, как Node.