[英]How to get all variables in the local scope of a process nodejs
你如何從本地范圍獲得所有變量? 例如 :
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 {} ]
你如何從本地范圍獲得所有變量?
你沒有。 Javascript沒有任何方法來迭代在本地范圍內聲明的變量。 您只能迭代全局范圍內的變量(隱式或有意)。
通常的解決方法是使您的變量成為本地對象的屬性,然后您可以隨時使用Object.keys()
for/in
來迭代該本地對象的屬性。
在您的示例中, x
未在任何范圍內顯式聲明(如果您未在嚴格模式下運行),則Javascript使其成為全局。 如果您在嚴格模式下運行,則分配給未聲明的變量是錯誤的(因為這通常是一件壞事)。
其他聲明的變量位於節點模塊作用域中 ,它是本地函數作用域(每個節點模塊都包含在一個函數中),並且該函數由加載器調用,因此每個模塊都有自己的私有函數作用域。
將打印x,但沒有其他定義的變量。
因為只有x
是全局的。 其他聲明的變量是模塊包裝函數的本地變量,加載器會自動將所有節點模塊放入其中。 在node.js中,您不能將代碼放在實際的top / global范圍中。 您的代碼位於節點為您的模塊創建的函數包裝器中。
當你沒有用let
, var
或const
聲明變量時,那個變量在NodeJS環境中被認為是global
,但是當我們嘗試運行代碼時這會給出錯誤。 因此,將變量或方法聲明為global
的更好方法是將當時指定為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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.