当Javascript构造函数应包含项时,它将数组复制为空

时间:2014-01-02 06:21:32

标签: javascript

我的代码:

function BayesNet(vars) {
 this.variables = {};
 this.numVars = Object.keys(this.variables).length;
    for (v in vars) {
      this.variables[v] = new BayesNode(vars[v]);
      this.variables[v].CPTorder = this.generateDomainRows(this.variables[v].parents);
      this.variables[v].fullCPT = {}
      for (var i = 0; i < this.variables[v].CPTorder.length; i++) {
         this.variables[v].fullCPT[this.variables[v].CPTorder[i]] = this.variables[v].CPT[i];
      }
       this.variables[v].blocks = false;
  } 
}


function BayesNode(obj) {
    this.parents = obj.parents;
    this.children = obj.children;
    if (typeof obj.domain == 'undefined')
        this.domain = ['T','F'];
    else
        this.domain = obj.domain;
    this.observation = obj.observation;
    this.CPT = obj.CPT;

    this.sampleDistribution = [];
    for (var i = 0; i < this.CPT.length; i++) {
        var s = [];
        if(this.CPT[i].length == this.domain.length - 1)
            this.CPT[i].push(1 - sumArray(this.CPT[i]));
        s.push(this.CPT[i][0]);
        for (var j = 1; j < this.domain.length - 1; j++) {
           s.push(this.CPT[i][j]+s[j-1]);
        }
        s.push(1.0);
        this.sampleDistribution.push(s);
    }
    //TODO: Check if CPT is valid
}

我的问题是BayesNode.parent被错误地复制了。

BayesNode.parent应该是一个包含项的数组,当我通过构造函数运行调试器时,this.parents是正确的值。但是,一旦我回到BayesNet构造函数,parent就是一个空数组。可能是什么导致了这个?对象中的所有其他变量都按预期运行。

2 个答案:

答案 0 :(得分:1)

Javascript异步执行函数调用。这是您的问题的根本原因。您应该使用回调来执行依赖于函数调用结果的代码。

让我用你的代码解释一下:

this.variables[v] = new BayesNode(vars[v]);
this.variables[v].CPTorder = this.generateDomainRows(this.variables[v].parents);

当你调用构造函数时,JS不会等到函数完成执行,然后再转到下一行代码。当JS遇到“this.variables [v] .parents”时,它是空的,因为前一行中的函数调用仍然是异步执行。

与大多数其他语言相比,Javascript代码设计需要不同的方法。

答案 1 :(得分:0)

我没有看到你的代码中有任何问题,奇怪为什么它变空了。但要解决问题还有办法。更改代码如下。

这一行之后

   this.variables[v] = new BayesNode(vars[v]);

添加以下

   this.variables[v].parents = vars[v].parents;

我看到你没有修改构造函数中的父项,它会在你发现最新情况之前暂时工作。你可能已经这样做了:)