2016-12-02 75 views
1

假设我正在构建自己的命令行,并且希望能够访问甚至更改任何通常在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); 
}); 

有一定的解决方案。

回答

0

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


但我在这里留着后代。


在Node.js的,相当于windowglobal。例如:

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

这包含了每一个全局变量(包括系统的像process)以及那些你定义(如上所示)。

+0

这不适用于脚本,只适用于REPL。 – Monstrum

+0

Hrm。这很奇怪,我以为我曾经用过(现在我只是测试它,它不起作用) – MayorMonty

+0

我读到,如果我只是定义变量没有'var'('variable = 123'),那么它会显示在全球('全球['变量']'),但我不知道这是多么可靠,它是多么不同'var'。 – Monstrum

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但建议使用此方法,因为您可以轻松地嘲笑商店以进行测试。

+0

我并不完全想要存储变量,但如果我想这样做,我可以使用'全局'。此外,它会干扰我的自然编码习惯,而且我不期望为一个大型项目做些什么。无论哪种方式,如果这是不可能的,我可能不得不。 – Monstrum