Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法访问';这';嵌套函数中的_Javascript_Node.js - Fatal编程技术网

Javascript 无法访问';这';嵌套函数中的

Javascript 无法访问';这';嵌套函数中的,javascript,node.js,Javascript,Node.js,所以我需要一些帮助我已经被困在这个问题上好几个小时了 问题是我正在创建一个名为Rank的对象。Rank需要在mongodb中进行一些DB调用,以获取填充矩阵的数据,然后需要在此矩阵上执行更多嵌套函数调用,我还没有编写这些函数。问题是,当我调用doRank()时,它会获取公司和交易,并似乎将它们放在排名中,但当我调用createMatrix时,它无法访问“this” 我已经尝试在doRank()中的每个函数上使用.bind(this),这可以防止该方法不存在的错误,但是当我在doRank()末尾执

所以我需要一些帮助我已经被困在这个问题上好几个小时了

问题是我正在创建一个名为Rank的对象。Rank需要在mongodb中进行一些DB调用,以获取填充矩阵的数据,然后需要在此矩阵上执行更多嵌套函数调用,我还没有编写这些函数。问题是,当我调用doRank()时,它会获取公司和交易,并似乎将它们放在排名中,但当我调用createMatrix时,它无法访问“this”

我已经尝试在doRank()中的每个函数上使用.bind(this),这可以防止该方法不存在的错误,但是当我在doRank()末尾执行console.log时,矩阵的结果是未定义的

function Rank(dampingfactor){
  this.damping_factor = dampingfactor;
  this.companies = null;
  this.transactions = null;
  this.matrix = null;

  this.doRank(function(){
    //companies returns valid
    console.log(this.companies);
    //transactions return valid
    console.log(this.transactions);
    //matrix returns as undefined... help here please
    console.log(this.matrix);
  });
};

Rank.prototype.doRank = function(callback) {
  this.getTransactions(function() {
    this.getCompanies(function () {
        this.createMatrix(function(){
            callback();
        }.bind(this));
    }.bind(this));
  }.bind(this));
};

Rank.prototype.getTransactions = function(callback){
  Transaction.find({}, function(err, transactions) {
    //blah blah blah
    this.transaction = transactions;
    callback();
  });
};

Rank.prototype.getCompanies = function(callback){
  Company.find({}, function(err, comps) {
    //blah blah blah
    this.transaction = comps;
    callback();
  });
};

Rank.prototype.createMatrix = function(callback){
  console.log(this.companies)
  //this returns "null"
  var matrix = new Array(_.size(this.companies));
  for(var i = 0; i < _.size(this.companies); i++){
      matrix[i] = new Array(_.size(this.companies));
      for(var j=0; j < _.size(this.companies); j++){
        matrix[i][j] = 0;
      }
  }
  this.matrix = matrix;
  callback();
};
函数秩(阻尼因子){
此。阻尼系数=阻尼系数;
此参数为空;
this.transactions=null;
这个矩阵=null;
this.doRank(函数(){
//公司申报有效期
console.log(this.companys);
//交易返回有效
console.log(this.transactions);
//矩阵返回为未定义…请在此提供帮助
console.log(this.matrix);
});
};
Rank.prototype.doRank=函数(回调){
this.getTransactions(函数(){
此.getCompanys(函数(){
这个.createMatrix(函数(){
回调();
}.约束(这个);
}.约束(这个);
}.约束(这个);
};
Rank.prototype.getTransactions=函数(回调){
Transaction.find({},函数(err,transactions){
//废话废话
本交易=交易;
回调();
});
};
Rank.prototype.getcompanys=函数(回调){
Company.find({},函数(err,comps){
//废话废话
本交易=公司;
回调();
});
};
Rank.prototype.createMatrix=函数(回调){
console.log(this.companys)
//这将返回“null”
var矩阵=新数组(u.size(this.companys));
对于(var i=0;i
在嵌套函数调用中使用时不再引用对象,因为该函数没有父对象。如果将
this
分配给变量,例如
var self=this
,则可以像正常的内部嵌套函数调用一样访问它。

getTransactions
getCompanies
中的AJAX回调函数中,您也会丢失上下文。试试这个:

Rank.prototype.getTransactions = function(callback) {
    Transaction.find({}, function(err, transactions) {
        //blah blah blah
        this.transaction = transactions;
        callback();
    }.bind(this));
};

Rank.prototype.getCompanies = function(callback) {
    Company.find({}, function(err, comps) {
        //blah blah blah
        this.transaction = comps;
        callback();
    }.bind(this));
};

使用
.bind()
是一种很好的方法。如果
.doRank()
末尾的
console.log()
位于函数的最末尾,而不是在调用
callback()
之后立即调用,然后结果是
未定义
,因为您使用的是异步API。当我尝试访问doRank GetCompanys或createMatrix中的原始对象时,所有内容都似乎为空,绑定的某些内容不起作用。您的解决方案也有帮助,这是真的,但使用
.bind()
在发布的代码中也会起作用。说“此的范围被重新定义”是令人困惑和误导的。首先,我想你的意思是“价值”,而不是“范围”。它不是从任何东西上“重新定义”的,它具有与其他任何地方相同的含义,这是使用它的函数所属的对象。在本例中,没有函数是其成员的对象,因此它的值是全局对象(或null,取决于严格程度)。这导致了问题的出现!