代码之家  ›  专栏  ›  技术社区  ›  Marc Bollinger

Javascript:如何在处理程序中保留对请求发起程序的引用?

  •  1
  • Marc Bollinger  · 技术社区  · 14 年前

    我通常不是一个喜欢Javascript的人,但我一直在潜入,阅读 Douglas Crockford's book ,并编写一些琐碎、有用的小道消息作为Chrome扩展和 Node.js (请注意,这个问题与他们两个都无关)。

    MyObject 在以下示例中:

    MyObject.prototype = {
        PerformAction: function() {
            this.Request = new XMLHttpRequest();
            this.Request.open("GET", this.ConstructUrl(), true);
            // From within ActionResultHandler, 'this' will always be the XMLHttpRequest
            this.Request.onload = this.ActionResultHandler,
            this.Request.send(null);
        }
    }
    

    this 作为请求对象本身,如果我简单地介绍一个包装器:

    this.Request.onload = function() { ActionResultHandler() };
    

    好吧,那是不行的 任何东西 ,因为ActionResultHandler现在超出范围。我在这里问这个问题的原因是因为我只发现了一些琐碎的调用者操纵案例(例如操纵什么 是指从函数内部),但考虑到面向对象的Javascript和AJAX无处不在,这必须是一个已知的、简单的问题,但我的googlefu在这里让我失望了。在C#中,事件是在连接到事件的人的上下文中调用的,而不是在触发事件的对象的上下文中调用的,因此这不会每天出现。也许有一个更好的JS模式可以完全避免这个问题?

    2 回复  |  直到 14 年前
        1
  •  4
  •   lawnsea    14 年前

    我不太清楚你想引用哪个变量。以下是如何保留对 MyObject

    MyObject.prototype = {
        PerformAction: function() {
            var MyObjectRef = MyObject,
                ActionResultHandler = this.ActionResultHandler;
    
            this.Request = new XMLHttpRequest();
            this.Request.open("GET", this.ConstructUrl(), true);
            // From within ActionResultHandler, 'this' will always be the XMLHttpRequest
            this.Request.onload = function () {
                    ActionResultHandler.apply(MyObjectRef, arguments);
                };
            this.Request.send(null);
        }
    }
    

    编辑

    好的,我再次阅读了你的问题,似乎你想在MyObject的上下文中执行ActionResultHandler,所以我调整了代码来实现这一点。

        2
  •  1
  •   bschaeffer    14 年前

    this.Request.onload = this.ActionResultHandler.apply(this);
    

    我想这就是你想要的(如果不是的话,很抱歉)。使用 .apply(this) ActionResultHandler Object .

    退房 this article