【问题标题】:JavaScript (node.js) variable not accessible on inner function call. now.js内部函数调用时无法访问 JavaScript (node.js) 变量。现在.js
【发布时间】:2011-10-11 17:00:10
【问题描述】:

我在节点项目中使用 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"
    };
  });
};

【问题讨论】:

    标签: javascript node.js mongoose nowjs-sockets


    【解决方案1】:

    把代码改成这样:

    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 可能被设置为其他值。因此,要保留您要访问的值,请将其分配给内部函数中可用的不同局部变量。

    【讨论】:

    • 啊啊啊这就是“那个”的全部含义。
    【解决方案2】:
    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.bindthis 的值设置为您想要的值

    【讨论】:

    • 这种风格比 jfriend00 建议的使用 'that' 更好吗?
    • @beck 我称之为个人喜好。您还可以使用.bind 来隧道输入额外的参数。 (见编辑)
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2018-06-23
    相关资源
    最近更新 更多