You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Node.js脚本中获取当前所有变量及其值?

在Node.js中获取所有可访问变量的方法

当然可以!在Node.js里要抓全当前所有能访问到的变量,得分全局变量模块级局部变量两种情况来唠——毕竟它们的存储位置不一样,处理方式也有区别。

1. 搞定全局变量(包括process、console这类超级全局)

Node.js里所有全局变量都挂在global对象上,不管是官方自带的processconsoleBuffer,还是你手动挂载到全局的自定义变量,全在这儿。

要拿到所有全局变量的键值对,可以这么写:

// 过滤掉以下划线开头的内部私有属性,只留有用的全局变量
const globalVars = Object.fromEntries(
  Object.entries(global).filter(([key]) => !key.startsWith('_'))
);

console.log('全局变量列表:', globalVars);

要是只需要变量名,直接用Object.keys(global)就行,不过里面会混很多Node.js内部的私有属性(以下划线开头),所以上面的过滤会让结果更清爽。

2. 获取模块里的局部变量(比如你定义的http、util、fs)

Node.js每个模块都是独立的作用域,咱们用var/let/const定义的变量默认是模块私有的,不会跑到global上。要抓这些变量,有几种实用方式:

方式一:手动打包(简单直接)

如果是自己写的脚本,最省事的就是把当前作用域的变量打包成对象打印:

var http = require('http'), util = require('util'), fs = require('fs');

// 把要查看的变量都塞进一个对象里,一目了然
const moduleVars = { http, util, fs, __filename, __dirname };
console.log('模块局部变量:', moduleVars);

这种方式直观,适合小范围调试,就是得手动列一下变量名。

方式二:用VM模块自动化捕获

要是想自动抓所有局部变量,可以用Node.js内置的vm模块,它能创建一个上下文环境来帮咱们收集变量:

const vm = require('vm');
var http = require('http'), util = require('util'), fs = require('fs');

// 把全局变量和当前模块的局部变量都注入到上下文里
const context = vm.createContext(Object.assign({}, global, {
  http, util, fs, __filename, __dirname
}));

// 执行一段代码,把上下文里的所有变量转成键值对
const allVars = vm.runInContext(`Object.fromEntries(Object.keys(this).map(key => [key, this[key]]))`, context);
console.log('所有可访问变量:', allVars);

不过这种方式还是得手动注入局部变量,如果要完全自动捕获,得结合模块内部缓存来搞,复杂度会高不少,一般调试用不上这么麻烦的。

方式三:用REPL实时调试

要是你是在调试脚本,直接启动一个REPL会话更方便——它的上下文会包含当前模块的所有变量,你可以在终端里直接查看:

var http = require('http'), util = require('util'), fs = require('fs');

// 启动REPL,终端会出现调试提示符,直接输入变量名就能看值
const repl = require('repl');
repl.start({ prompt: '调试> ', context: this });

运行脚本后,输入http就能看到这个模块对象,输入process也能看全局的进程信息,非常灵活。

小提醒

  • 严格模式下,arguments.callee这类靠调用栈拿变量的方法会被禁用,别依赖它。
  • __filename__dirname这些是模块级的特殊变量,不属于global,得单独处理。
  • 要是想连原型链上的继承属性也一起抓,可以用for...in循环代替Object.entries,不过一般没必要,会拿到很多没用的属性。

内容的提问来源于stack exchange,提问作者BramscoChill

火山引擎 最新活动