如何在Node.js中使用全局对象获取常量?

时间:2019-01-05 11:40:05

标签: javascript node.js global-variables dynamic-programming

我想使用global object获得一个常数变量以动态使用它,但是global.myconstant不起作用,但是global.myvar起作用。

λ node
> const myconstant = true
undefined
> global.myconstant
undefined
> var myvar = true
undefined
> global.myvar
true
> global.const
undefined

我想做的事:

const myconstant = () => { console.log("ok const"); };
var myvariable = () => { console.log("ok var"); };

const watchlist = {
  myconstant: "file1.html",
  myvariable: "file2.html"
};

Object.keys(watchlist).forEach((taskName) => {
  try {
    global[taskName](); //doesn't work with const
  } catch (e) {
    console.error("error", taskName);
  }
});

实际输出:

error myconstant
ok var

想要的输出:

ok const
ok var

实时演示:https://repl.it/repls/SunnyScholarlyPasswords

如何获取带有字符串的const变量? 不将const替换为var

2 个答案:

答案 0 :(得分:3)

仅将用pip3声明的变量隐式分配给全局对象。如果要创建不可重新分配的属性,则应改用var。例如,在浏览器中,引用Object.defineProperty而不是window

global

Object.defineProperty( window, 'myconstant', { value: () => { console.log("ok const"); }, configurable: false } ); var myvariable = () => { console.log("ok var"); }; const watchlist = { myconstant: "file1.html", myvariable: "file2.html" }; Object.keys(watchlist).forEach((taskName) => { try { window[taskName](); } catch (e) { console.error("error", taskName); } }); // Won't reassign, and will throw an error in strict mode: window.myconstant = 'foo'; console.log(typeof window.myconstant);是密钥,尽管它是可选的-无论如何它默认为configurable: false。不可修改的属性无法修改或删除。

答案 1 :(得分:0)

描述的行为是节点REPL的自然行为,但不是节点REPL的自然行为,而模块中评估的代码则是自然行为。模块范围内的变量不会泄漏到全局变量,因为它们是在module scope中定义的,这对varconst都适用。这将在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导致在全局变量(Node中的global)上定义属性,而const则没有。

如果要定义全局,则应将其定义为属性:

global.myconstant = 1;
global.myvariable = 2;

如果需要定义不会被重新分配的全局变量,则应使用描述符(作为另一个答案已经说明):

Object.defineProperty(global, 'myconstant', {
  value: 1,
  configurable: false,
  writable: false
});

通常不建议将全局变量用于本地目的,尤其是在诸如Node之类的模块化环境中。