如何从本地范围获取所有变量?例如:
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 {} ]
答案 0 :(得分:2)
如何从本地范围获取所有变量?
您没有。 Javascript没有任何方法可以迭代在本地范围内声明的变量。您只能迭代全局范围内的变量(隐式或有意地)。
通常的解决方法是使变量成为本地对象的属性,然后您可以随时使用Object.keys()
对for/in
迭代该本地对象的属性。
在您的示例中,x
没有在任何范围内显式声明,因此(如果您未在严格模式下运行)则Javascript使其成为全局变量。如果您在严格模式下运行,则将其分配给未声明的变量是错误的(因为这样做通常是一件坏事)。
其他声明的变量在节点模块范围中,该变量是本地函数范围(每个节点模块都包装在一个函数中),该函数由加载程序调用,因此每个模块都有自己的模块私有功能范围。
将打印x,但不打印其他已定义的变量。
因为只有x
是全局变量。其他声明的变量对于模块包装器函数是局部的,加载程序会自动将所有节点模块放入模块包装器函数中。在node.js中,您不能将代码放置在实际的顶级/全局范围内。您的代码位于节点为您的模块创建的函数包装中。
答案 1 :(得分:1)
当您不使用let
,var
或const
声明变量时,则在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
的所有键,并打印有变量名t1
,missing
,依此类推。另外,要创建类的实例,您需要指定括号()
,例如new testit()
而不是new testit
。