动态访问变量

时间:2016-12-02 22:30:29

标签: javascript node.js

假设我正在构建自己的命令行,我希望能够访问甚至更改NodeJS中正常定义的任何变量。我将在另一个名为cmd[1]的变量中定义变量的名称。经过一段时间的研究,我得出结论,没有全局对象包含所有已定义的变量。如何返回另一个变量中描述的变量的数据?这是一个小代码块,解释了我想要实现的目标:

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'CMD> '
});

rl.prompt();

rl.on('line', (line) => {
  var commandl = line.trim();
  var cmd = commandl.split(' ');

  switch(cmd[0]) {
    case 'vr':
      //here i'd like to log the variable which name is in cmd[1]. if there was a global object i would assume i could just global[cmd[1]].
      break;
    case 'spit':
      //here i'd like to log an object with every defined variables and its live changes
      break;
    default:
      console.log(`${line.trim()}: command not found`);
      break;
  }
  rl.prompt();
}).on('close', () => {
  process.exit(0);
});

必须有一个解决方案。

2 个答案:

答案 0 :(得分:0)

@Waseem I.指出这只适用于REPL。

但是我要把它留在这里作为后代。

 

在Node.js中,等同于window的是global。例如:

> var a = 2;
> global.a // == 2

这包含每个全局变量(包括process之类的系统变量)和您定义的变量(如上所示)。

答案 1 :(得分:0)

为什么不能创建store并使用它?

<强> store.js

// store.js 
module.exports = {}

<强> app.js

// app.js
var store = require('./store');
var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: 'CMD> '
});

rl.prompt();

rl.on('line', (line) => {
  var commandl = line.trim();
  var cmd = commandl.split(' ');

  switch(cmd[0]) {
    case 'vr':
      store.vr = cmd[1];
      //here i'd like to log the variable which name is in cmd[1]. if there was a global object i would assume i could just global[cmd[1]].
      break;
    case 'spit':
      store.spit = '...';'
      break;
    default:
      console.log(`${line.trim()}: command not found`);
      break;
  }
  rl.prompt();
}).on('close', () => {
  process.exit(0);
});

<强> other.js

// other.js
var store = require('./store');

console.log(store.vr);

虽然您可以使用global,但建议使用此方法,因为您可以轻松地模拟商店以进行测试。