回调函数中的变量范围

时间:2013-07-08 14:45:21

标签: javascript node.js scope

我的javascript代码遇到了问题。

我有一个班级MyClass,并在其原型中添加了函数myFunction

MyClass.prototype.myFunction = function(file){
    if(some condition){
       fs.exists("./" + file, function(exists){
           if(exists)
               console.log(this.someValue);
               /* lot of other code */
           else
               /* do something else */
    });
    }else{
        /* do something */
    }
}

我的问题是this.someValue的范围(作为一个例子,我想打印它)。 每次exists等于true时,控制台会记录undefined,但事实并非如此。 如果我将它打印在fs.exists()之外,那么它有一个值,所以我猜这是一个范围问题。

如何在此示例中访问this.someValue

提前致谢!

3 个答案:

答案 0 :(得分:4)

你必须.bind你的内在功能

MyClass.prototype.myFunction = function(file){
    if(some condition){
       fs.exists("./" + file, function(exists){
           if(exists)
               console.log(this.someValue);
               /* lot of other code */
           else
               /* do something else */
    }.bind(this));
    }else{
        /* do something */
    }
}

这可以改写为更清洁

MyClass.prototype.myFunction = function myFunction(file){
  if(some condition){
    fs.exists("./" + file, this.doSomething.bind(this));
  }
  else{
    // do something else
  }
}

MyClass.prototype.doSomething = function doSomething(exists) {
  if(exists) {
    console.log(this.someValue);
    // lot of other code
  }
  else {
    // do something else
  }
}

我个人喜欢这个解决方案,因为它可以让您保持优秀的代码组合并阻止您嵌套function(){ function(){ function(){ ... }}}。它还可以防止你有一堆var that = this;var self = this;变量浮动,让你想知道哪个范围是哪个。

.bind速度较慢,是的,但正如minitech指出的那样,与文件访问相比,它肯定不会成为你的瓶颈。

答案 1 :(得分:3)

MyClass.prototype.myFunction = function(file){
  var that = this;
  // some lines of code later...
       console.log(that.someValue);
}

答案 2 :(得分:2)

作为this - 是由函数范围定义的关键字,并响应函数的所有者或调用者。因此,您可以将其指针存储在另一个变量中:

MyClass.prototype.myFunction = function(file) {
  if(some condition) {
    var self = this; // create variable with pointer to 'this'
    fs.exists("./" + file, function(exists) {
      if(exists) {
        console.log(self.someValue); // we can access it to parent scope variables
        /* lot of other code */
      } else {
        /* do something else */
      }
    });
  } else {
    /* do something */
  }
}

同时查看这个精彩主题:How does the "this" keyword work?