2013-04-05 84 views
3

我在写一些JavaScript代码。我对这个关键词有点困惑。如何访问dataReceivedHandler函数中的记录器变量?Javascript“this”scope

MyClass: { 
    logger: null, 
    init: function() { 
     logger = LogFactory.getLogger(); 
    }, 
    loadData: function() { 
     var dataReceivedHandler = function() { 
      // how to access the logger variable here? 
     } 

     // more stuff 
    } 
}; 

回答

6

假设loadData被称为像这样:

MyClass.loadData(); 

则:

loadData: function() { 
    var self = this; 
    var dataReceivedHandler = function() { 
     self.logger ... 
    } 

    // more stuff 
} 
9

你可以这样做的loadData函数里面的东西访问你的对象......

MyClass: { 
    logger: null, 
    init: function() { 
     this.logger = LogFactory.getLogger(); 
    }, 
    loadData: function() { 
     var self = this; 
     var dataReceivedHandler = function() { 
      // how to access the logger variable here? 
      self.logger.log('something'); 
     } 

     // more stuff 
    } 
}; 
3

Becaus e dataReceivedHandler是一个匿名函数,this将引用全局作用域上的窗口对象。我想你可以绕过这两条路。

一)内部loadData创建一个变量来保存它的上下文然后用它里面dataReceivedHandler这样:

loadData: function() { 
    var self = this; 
    var dataReceivedHandler = function() { 
     console.log(self.logger); 
    } 

    // more stuff 
} 

b)使用applycall更改匿名函数的上下文。

loadData: function() { 
    var dataReceivedHandler = function() { 
     console.log(this.logger); 
    } 
    // more stuff 
    dataReceivedHandler.call(this); // by passing this as the first argument we make sure the context of the excuted function is our current scope's this 
} 

由于性能和内存使用优化,我更喜欢选项B,但两者都可以正常工作。

+1

_“由于dataReceivedHandler是一个匿名函数,它将引用全局范围上的窗口对象。”_ - 当您通过名称“dataReceivedHandler”引用它时,它不是匿名的。匿名或不是'this'的值取决于函数是如何被调用的,而不是它如何定义的(正如你大概知道给出你的第二个例子)。请注意,只有在调用'loadData()'方法将'this'设置为'MyClass'对象时,您的答案中的两种方法才会起作用。 – nnnnnn 2013-04-05 00:32:39

+1

当声明一个没有返回变量名称的函数('function(){}'而不是'function name(){}')时,这就是你所说的匿名函数。匿名函数的上下文将始终是'window',除非被诸如'call'或'apply'之类的方法覆盖。我错了吗?如果是这样,请举例说明否则。 – iMoses 2013-04-05 00:35:55

+0

我正在纠正自己。如果匿名函数是对象(名称空间)的一部分,只要直接从该对象执行该方法,就会引用该对象。 – iMoses 2013-04-05 00:37:41