如何从Javascript类方法引用函数?

mik*_*725 6 javascript reference deep-linking

我使用SWFAddress深度链接我的站点(链接到SWFAddress).我喜欢将代码分解为类,因此我有一个类似于此的主结构:

function SomeClass() {
    //this adds the this.handleChange() function to the
    //SWFAddress event listener
    this.initializeSWFA = function() {
        //SWFAddress variable is instantiated in SWFAddress javascript file
        //so I can use it here
        SWFAddress.addEventListener(SWFAddressEvent.CHANGE, this.handleChange);
    }

    //SWFAddress suppose to call this function
    this.handleChange= function(evt) {
    //some code here
    }

}

//instantiate the SomeClass
var someVar = new SomeClass();
someVar.initializeSWFA();
Run Code Online (Sandbox Code Playgroud)

这条线在这里不起作用:

SWFAddress.addEventListener(SWFAddressEvent.CHANGE, this.handleChange);
Run Code Online (Sandbox Code Playgroud)

我尝试将其更改为:

SWFAddress.addEventListener(SWFAddressEvent.CHANGE, this.handleChange());
Run Code Online (Sandbox Code Playgroud)

要么

var self = this;
SWFAddress.addEventListener(SWFAddressEvent.CHANGE, self.handleChange);
Run Code Online (Sandbox Code Playgroud)

而这些也不起作用.

那么如何在这样的情况下从类中引用javascript函数呢?如果函数handleChange在类之外,我可以编写函数的名称.

先感谢您

编辑

首先,谢谢你的所有答案.我仍然试图想象这一切在Javascript中是如何工作的.我不习惯像Javascript这样的面向对象模型.

这是现在的解决方案.我仍然无法弄清楚如何在Javascript中很好地做到这一点,但这个解决方案的工作原理.我试图实现ehudokai建议的解决方案(谢谢)但是无法使其工作.

function SomeClass() {
    //this adds the this.handleChange() function to the
    //SWFAddress event listener
    this.initializeSWFA = function() {
        //SWFAddress variable is instantiated in SWFAddress javascript file
        //so I can use it here
        SWFAddress.addEventListener(SWFAddressEvent.CHANGE, someFunc);
    }

    //SWFAddress suppose to call this function
    this.handleChange= function(evt) {
    //some code here
    }

}

//instantiate the SomeClass
var someVar = new SomeClass();

function someFunc(evt) {
    someVar.handleChange(evt);
}

someVar.initializeSWFA();
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个,因为这涉及定义一个额外的函数,所以需要额外的空间如果有人想出如何从Javascript对象向SWFAddress EventListener添加方法,请帮助我.

Dav*_*ang 7

你的班级结构完全有效.但是,如果您的handleChange()函数使用this关键字someVar,那么这就是您的问题所在.

这是发生的事情:

  1. SWFAddress.addEventListener(SWFAddressEvent.CHANGE, this.handleChange);正确引用类中的处理函数.SWFAddress将该函数缓存到某个变量,f直到调度该事件为止.
  2. 调度事件时,SWFAddress调用f.虽然保留了对函数的引用,但是对上下文的引用,或者this不是.因此this默认为window.

要解决这个问题,您只需使用一个匿名函数来捕获类范围内的变量.您可以使用此匿名函数中的正确上下文调用处理程序:

function SomeClass() {
    this.initializeSWFA = function() {
        // Save a reference to the object here
        var me = this;

        // Wrap handler in anonymous function
        SWFAddress.addEventListener(SWFAddressEvent.CHANGE, function (evt) {
            me.handleChange(evt);
        });
    }

    //SWFAddress suppose to call this function
    this.handleChange= function(evt) {
    //some code here
    }

}
Run Code Online (Sandbox Code Playgroud)

this按照OP的要求解释:

this关键字可以以不同的方式来解释:首先采取的读这篇文章的范围,然后这篇关于面向对象的JavaScript.

我也想提出我的快速推理,你可能会觉得有帮助.请记住,Javascript没有像Java这样的语言的"类".在这些语言中,类的"方法"仅属于该类(或可以继承).然而,在javascript中,只有对象和对象属性才会发生在函数中.这些函数是自由代理 - 它们不属于一个或另一个对象,就像字符串或数字一样.例如:

var a = {
    myMethod: function () {...}
};

var b = {};
b.myMethod = a.myMethod;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,哪个对象确实myMethod属于?没有答案,可能是a或者b.因此,a.myMethod它只是对函数的引用,与"上下文"或父对象不相关.因此,this除非使用or 显式调用,因此没有任何意义,因此默认情况下以任何其他方式调用.出于同样的原因,javascript中没有关键字或关键字.a.myMethod()b.myMethod()windowparentsuper