我是node.js的新手。我在使用全局变量时遇到问题。我的代码和结果如下。我预计结果为0 2 0 3 0 5 2 4 3 6 5 10,依此类推,因为3个子实例继承了'parent',每个'parent'都有'GLOBAL'变量。但似乎3个孩子共享1个变量。任何人都可以解释这种情况吗?
let GLOBAL = 0;
function change(num) {
console.log("before", GLOBAL);
GLOBAL += num;
console.log("after", GLOBAL);
}
class Parent {
constructor() {
this._name = "parent"
}
proc() {
change(this._num);
}
}
module.exports = Parent;
child.js
const parent = require("./parent.js");
class Child extends parent {
constructor(num) {
super();
this._num = num;
}
_proc() {
this.proc(this._num);
}
}
module.exports = Child
main.js
const child = require("./child.js");
let child2 = new child(2);
let child3 = new child(3);
let child5 = new child(5);
setInterval(() => {
child2._proc();
child3._proc();
child5._proc();
}, 2000);
结果
<小时/> 在0之前 2之后 在2之前 5之后 5之前 10后 10月之前 12年之后 在12年之前 15年后 在15年之前 20后 在20年之前 22后 在22之前 25后 在25年之前 30后 30年之前 32后 在32之前 35后 35年之前 40后 ^ C
答案 0 :(得分:0)
您正在寻找的是而不是全球,因为它目前实际上是全球性的。如果我理解正确,您需要每个父的全局,例如
class Parent {
constructor() {
this._name = "parent"
this.GLOBAL = 0;
}
proc() {
console.log("before", this.GLOBAL);
this.GLOBAL += this.num;
console.log("after", this.GLOBAL);
}
}
module.exports = Parent;
答案 1 :(得分:0)
这是因为所有子实例都有自己的num属性,但在调用_proc方法时它们使用相同的GLOBAL对象。
因为您在更改函数的外部作用域上声明了GLOBAL变量,所以它将被封装在更改函数中并且不会被处理。因此,无论何时调用change函数,它都将使用相同的GLOBAL变量。
作为建议,如果您想了解有关该主题的更多信息,可以阅读道格拉斯克罗克福德的书籍Javascript,Good Parts。