如何在流程节点的本地范围内获取所有变量

时间:2018-08-24 07:20:01

标签: javascript node.js variables scope

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

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,但不打印其他已定义的变量。

编辑:我们已经确定了以下解决方案,有何意见?

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

"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 {} ]

2 个答案:

答案 0 :(得分:2)

  

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

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

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

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

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

  

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

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

答案 1 :(得分:1)

当您不使用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