不能在嵌套函数中访问“this”

所以我需要一些帮助,我一直坚持这个几个小时了..

问题是我正在创build这个名为秩的对象。 Rank需要在mongodb中进行一些数据库调用以获取数据以填充matrix,然后需要在此matrix上执行更多的嵌套函数调用,这些调用还没有写入。 问题是,当我打电话给doRank()它获取公司和交易,似乎把他们在Rank中,但后来当我打电话给createMatrix它不能访问“这个”

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

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(); }; 

您在getTransactionsgetCompanies中的AJAXcallback函数中失去了上下文。 尝试这个:

 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)); }; 

当在嵌套函数调用中使用时,不再引用对象,因为该函数没有父对象。 如果你把this赋值给一个variables,比如var self = this ,你可以像嵌套函数调用中的普通函数那样访问它。