JavaScript(node.js)变量在内部函数调用时不可访问。now.js

JavaScript(node.js)变量在内部函数调用时不可访问。now.js,javascript,node.js,mongoose,nowjs-sockets,Javascript,Node.js,Mongoose,Nowjs Sockets,我在一个节点项目中使用now.js和Mongoose,在访问Mongoose函数中的this.now对象时遇到问题。例如 everyone.now.joinDoc = function (project_id){ this.now.talk(); //this will work Project.findOne({'_id':project_id}, function(err, project){ if(project){ this.now.talk(); //

我在一个节点项目中使用now.js和Mongoose,在访问Mongoose函数中的this.now对象时遇到问题。例如

everyone.now.joinDoc = function (project_id){  
  this.now.talk(); //this will work
  Project.findOne({'_id':project_id}, function(err, project){
    if(project){
      this.now.talk(); // this will not work "TypeError: Cannot call method 'bark' of undefined"
    };
  });
};

将代码更改为:

everyone.now.joinDoc = function (project_id){  
  this.now.talk();  // this will work
  var that = this;  // save 'this' to something else so it will be available when 'this' has been changed
  Project.findOne({'_id':project_id}, function(err, project){
    if(project){
      that.now.talk();  // use local variable 'that' which hasn't been changed
    };
  });
};

在内部函数中,
this
可能被设置为其他值。因此,要保留要访问的值,可以将其分配给内部函数中可用的其他局部变量。

将代码更改为:

everyone.now.joinDoc = function (project_id){  
  this.now.talk();  // this will work
  var that = this;  // save 'this' to something else so it will be available when 'this' has been changed
  Project.findOne({'_id':project_id}, function(err, project){
    if(project){
      that.now.talk();  // use local variable 'that' which hasn't been changed
    };
  });
};
everyone.now.joinDoc = function (project_id){  
  this.now.talk();  // this will work
  Project.findOne({'_id':project_id}, (function(tunnel, err, project){
    if(project){
      this.now.talk(); 
    };
  }).bind(this, "tunnel")); // overwrite `this` in callback to refer to correct `this`
};
在内部函数中,
this
可能被设置为其他值。因此,要保留要访问的值,可以将其指定给内部函数中可用的其他局部变量

everyone.now.joinDoc = function (project_id){  
  this.now.talk();  // this will work
  Project.findOne({'_id':project_id}, (function(tunnel, err, project){
    if(project){
      this.now.talk(); 
    };
  }).bind(this, "tunnel")); // overwrite `this` in callback to refer to correct `this`
};
使用
Function.prototype.bind
this
的值设置为所需的值


使用
Function.prototype.bind
this
的值设置为您想要的值

ahhh brilliant这就是“that”的全部含义。ahhh brilliant这就是“that”的全部含义。这比jfriend00建议的使用“that”更好吗?@beck我称之为个人偏好。您还可以使用
.bind
来隧道额外的参数。(参见编辑)这种风格是否比jfriend00建议的使用“that”更好?@beck我称之为个人偏好。您还可以使用
.bind
来隧道额外的参数。(见编辑)