代码之家  ›  专栏  ›  技术社区  ›  Matt

如何获取进程nodejs的本地范围内的所有变量

  •  1
  • Matt  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  2
  •   jfriend00    8 年前

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

    你没有。 Javascript没有任何方法来迭代本地作用域中声明的变量。只能迭代全局范围内的变量(隐式或有意)。

    通常的解决方法是将变量设置为本地对象的属性,然后可以随时使用 Object.keys() 对于 for/in .

    在你的例子中 x 在任何范围内都没有显式声明,因此(如果不是在严格模式下运行),那么Javascript会使其成为全局的。如果您是在严格模式下运行的,则为未声明的变量赋值是错误的(因为这通常是一件坏事)。

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

    将打印x,但没有其他定义的变量。

    因为只有 十 是全球性的。其他声明的变量是加载程序自动将所有节点模块放入的模块包装器函数的本地变量。在node.js节点,不能将代码放在实际的顶级/全局作用域中。代码位于节点为模块创建的函数包装器中。

        2
  •  1
  •   Ankit Agarwal    8 年前

    如果不使用 let , var 或 const 那么这个变量被认为是 global 在NodeJS环境中,但当我们试图运行代码时,这会产生错误。因此,将变量或方法声明为 全球的 是通过将then指定为 全球的 反对。像这样的:

    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));
    

    这样你就能得到所有的钥匙 全球的 用变量名打印 t1 , missing 等等。另外,要创建类的实例,需要指定括号 () 喜欢 new testit() 而不是 new testit .