列出 Node.js 中的所有全局变量

21

我想列出所有全局变量,包括那些与内置对象有关的。

在Chrome的控制台中,我可以简单地输入this并返回所有键,包括像StringNumber等的内容。

但是当我在Node.js中执行此操作时,输出的内容要少得多:

> Object.keys(this)
[ 'global',
  'process',
  'GLOBAL',
  'root',
  'Buffer',
  'setTimeout',
  'setInterval',
  'clearTimeout',
  'clearInterval',
  'setImmediate',
  'clearImmediate',
  'console',
  'module',
  'require',
  '_' ]
> this.eval
[Function: eval]

this.eval 是从哪里来的?


1
尝试使用 Object.keys(Object.getPrototypeOf(this))Object.getOwnPropertyNames(this)(分别用于继承和非枚举属性) - Bergi
Object.getOwnPropertyNames(this) 做到了,谢谢 @Bergi! - ldmat
1
在文件中,它作为一个模块被加载,其中 this 不是全局对象。 - Bergi
console.log(global); ? - Rahly
1
node -p "Object.getOwnPropertyNames(global)" - jhonny lopez
3个回答

12

对于任何使用一些浏览器内置编码工具的人,比如codepen、tslang等,请注意这个答案不适用,你需要使用类似ts-node的本地工具进行测试,或直接在浏览器控制台中测试。 - New Alexandria
它不起作用,我得到了 TypeError: 无法将 undefined 或 null 转换为对象 - user5359531
@user5359531 你运行了什么代码以及在哪里运行的?显然你没有传递全局对象。 - Bergi
我运行了 Object.getOwnPropertyNames(this) - user5359531
@user5359531 而 在哪里this的值取决于很多因素,显然您的this不是全局对象。请使用其他东西。 - Bergi
显示剩余3条评论

10
以下 globals() 函数将获取全局命名空间对象:
function globals() { return this; }

使用它,您随时可以列出全局命名空间的所有变量:

function varsList() {
  return Object.getOwnPropertyNames(globals());
}

更新:

在现代浏览器中,您可以使用globalThis命名空间对象来保存全局命名空间变量:

function globalVarsList() {
  return Object.getOwnPropertyNames(globalThis);
}

for(const name of globalVarsList()) {
   console.log(name); 
}

这也适用于严格模式。


2
在严格模式下呢?;-) - RobG
1
无法正常工作,出现“TypeError:无法将未定义或空值转换为对象”的错误。 - user5359531

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接