【问题标题】:How to get all variables in the local scope of a process nodejs如何获取进程nodejs的本地范围内的所有变量
【发布时间】:2019-01-30 15:11:43
【问题描述】:

如何从本地范围内获取所有变量?例如:

x=1;

class testit {
  constructor (){
    this.a='two';
  }
}

var t1=new testit;

var missing = new testit;

var missing2 = 1;

var vars = Object.keys(global);
console.log(vars)

将打印 x,但不打印其他已定义的变量。

编辑:我们已经确定了以下解决方案,任何 cmets ?

为了允许使用这种类型的概念,允许程序跟踪我们所有的类实例,而不会在全局添加中出现人为错误,我们现在继承了一个基类:

"use strict";

global.childClasses = [];

class BaseClass {
  constructor(){
    global.childClasses.push(this);
  }

  static print(){
    console.log(global.childClasses);
  }
}

module.exports = {
  BaseClass
}

我们现在可以通过调用基类的静态方法来列出所有实例,就像在这个 testExample.js 文件列表中一样:

"use strict";
let BaseClass = require('./baseClass').BaseClass;

class Test1 extends BaseClass {}
let test1 = new Test1;

class Test2 extends BaseClass {}
let test2 = new Test2;

BaseClass.print();

哪些输出:

$ node ./testExample.js 
[ Test1 {}, Test2 {} ]

【问题讨论】:

标签: javascript node.js variables scope


【解决方案1】:

如何从本地范围内获取所有变量?

你没有。 Javascript 没有任何方法可以迭代在本地范围内声明的变量。您只能迭代全局范围内的变量(隐式或有意)。

通常的解决方法是让您的变量成为本地对象的属性,然后您可以随时使用Object.keys()for/in 迭代该本地对象的属性。

在您的示例中,x 没有在任何范围内显式声明(如果您没有在严格模式下运行),那么 Javascript 会将其设为全局。如果您在严格模式下运行,则分配给未声明的变量是错误的(因为这通常是一件坏事)。

其他声明的变量在节点模块范围中,这是本地函数范围(每个节点模块都包装在一个函数中)并且该函数由加载器调用,因此每个模块都有自己的私有函数范围。

将打印 x,但不打印其他已定义的变量。

因为只有 x 是一个全局变量。其他声明的变量对于加载器自动将所有节点模块放入的模块包装器函数是本地的。在 node.js 中,您不能将代码放在实际的顶级/全局范围内。您的代码位于节点为您的模块创建的函数包装器中。

【讨论】:

    【解决方案2】:

    当您没有使用letvarconst 声明变量时,该变量在 NodeJS 环境中被视为global,但是当我们尝试运行代码时会出错。因此,将变量或方法声明为global 的更好方法是将then 分配为global 对象的属性。像这样的:

    global.x=1;
    
    class testit {
      constructor (){
        this.a='two';
      }
    }
    
    global.t1=new testit();
    
    global.missing = new testit();
    
    global.missing2 = 1;
    console.log(Object.keys(global));
    

    这样你就可以得到global 的所有键,上面印有变量名t1missing 等等。此外,要创建类的实例,您需要指定括号 (),例如 new testit() 而不是 new testit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 2010-10-19
      • 1970-01-01
      相关资源
      最近更新 更多