javascript - Firefox 插件 - `this` 在同一对象的一种方法中有效,但在另一种方法中失败

标签 javascript firefox-addon this

我正在为 Firefox (3.6.*) 开发一个附加组件。在以下代码中,从 init 内部调用的 notify 工作正常,但在调用时出现错误,提示 this.notify 不是函数onPageLoad 中。这是为什么?

此外,当我将调用更改为 myextobj.notify('title', 'msg') 时,它会起作用。访问变量也是如此。那么,this 和作为前缀的对象名有什么区别呢?

var myextobj = {
  init: function() {
    this.notify('init', 'We are inside init');
    ...
    var appcontent = document.getElementById("appcontent");   // browser  
    if(appcontent)  
      appcontent.addEventListener("DOMContentLoaded", this.onPageLoad, true);
  },
  onPageLoad: function(aEvent) {
    this.notify('onPageLoad', 'We are inside onPageLoad');
    ...
  },

  notify: function (title, text) {  
    Components.classes['@mozilla.org/alerts-service;1'].  
      getService(Components.interfaces.nsIAlertsService).  
      showAlertNotification(null, title, text, false, '', null);  
  }  
};
window.addEventListener("load", function() { myextobj.init(); }, false);

最佳答案

当你这样做时:

appcontent.addEventListener("DOMContentLoaded", this.onPageLoad, true);

您只需添加 onPageLoad 中保存的函数作为事件处理程序。与对象的连接丢失,执行时 this 将引用全局对象。

只需创建一个匿名函数,就像为 load 事件所做的那样:

var that = this; // capture reference to object
appcontent.addEventListener("DOMContentLoaded", function(event) {
    that.onPageLoad(event);
    // myextobj.onPageLoad(event); should also work in this case
}, true);

请记住,函数是 JavaScript 中的第一类对象,它们可以像任何其他值一样传递。函数没有对其定义的对象的引用,因为它们不属于该对象。它们只是另一种数据。

函数中 this 引用的对象是在执行时决定的,并且取决于函数执行的上下文。如果您调用 obj.func () 那么上下文是 obj,但是如果您之前将函数分配给另一个变量,例如 var a = obj.func (这就是您所做的事情)添加事件处理程序(以某种方式)),然后调用 a()this 将引用全局对象(最常见的是 window的时间)。

关于javascript - Firefox 插件 - `this` 在同一对象的一种方法中有效,但在另一种方法中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4366214/

相关文章:

javascript - 在另一个模型中引用/填充 Mongoose 模型时出现问题

javascript - 需要 ("sdk/window/utils").windows() 的私有(private)窗口

c# - 我可以在 C# 中调用同一个类的重载构造函数吗?

javascript - 等待异步调用不适用于ajax

javascript - Google Maps API v3 折线在更新时不显示

javascript - 将功能添加到 Firefox 扩展 Javascript 文件

javascript - 不允许使用 firefox 插件 innerHTML,需要 DOM 帮助

namespaces - 上下文和命名空间有什么区别?

c++ - 成员函数中 'delete this' 的用处

javascript - 如何显示作为 API 调用响应的图像?