node.js继承时的全局变量

时间:2018-03-10 15:55:46

标签: javascript node.js

我是node.js的新手。我在使用全局变量时遇到问题。我的代码和结果如下。我预计结果为0 2 0 3 0 5 2 4 3 6 5 10,依此类推,因为3个子实例继承了'parent',每个'parent'都有'GLOBAL'变量。但似乎3个孩子共享1个变量。任何人都可以解释这种情况吗?


parent.js

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

2 个答案:

答案 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。