我试图将大型JS代码库从单个文件重构为多个文件中的多个类。我无法访问我认为应该可以访问的变量。我一定对javascript对象/ NodeJS模块/导出/导入/引用“ this”有误解。

在开始之前,所有内容都在块module.exports = function Ai() { ...中的ai.js文件中

我根据EcmaScript 6 Class语法创建了文件heatMap.js:

module.exports = HeatMap;
class HeatMap {
    constructor(ai, ...) {
        this.ai = ai;
        ...
    }
    ...
}


我修改了ai.js,以导入HeatMap类,实例化该类,并将该对象的引用传递给ai对象,以便该热图可以访问其变量。

const HeatMap = require("heatMap.js");
module.exports = function Ai() {
    var ai = this;
    var currentRound = ...
    ...
    function bookKeeping(...) {
        heatMap = new HeatMap(ai,...);
        ...
    }
    ...
}


尝试使用this.ai.currentRound访问heatMap内部的currentRound会产生:


  尚未解决的变量currentRound。


为什么? “ this”应该引用实例化的heatMap对象,“ ai”应该引用ai对象,并且ai对象具有变量currentRound。进行此工作的一种方法是将所有变量作为函数调用中的参数传递,但是其中有很多变量,因此这不是一个干净的解决方案。

最佳答案

给定HeatMap定义:

module.exports = HeatMap;

function HeatMap(ai) {
  console.log(ai.currentRound);
}


AI定义:

module.exports = AI;
const HeatMap = require('HeatMap');

function AI() {
  this.currentRound = 0;
}

AI.prototype.bookKeeping = function bookKeeping() {
  const heatMap = new HeatMap(this);
}


0实例调用bookKeeping()时,应该看到AI打印出来。

我不使用ES2015类,但从我的角度来看,您的范围是错误的。您的currentRound变量在本地作用于AI函数,并且不会以任何方式公开(在您提供的代码段中)。因此,当您将AI的实例传递给HeatMap时,currentRound可用于AI构造函数公开的方法,但不适用于HeatMap函数本身。

关于javascript - NodeJS和ES6类实例中的变量可见性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36266467/

10-13 06:42