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添加方法,请帮助我.
你的班级结构完全有效.但是,如果您的handleChange()函数使用this关键字someVar,那么这就是您的问题所在.
这是发生的事情:
SWFAddress.addEventListener(SWFAddressEvent.CHANGE, this.handleChange);正确引用类中的处理函数.SWFAddress将该函数缓存到某个变量,f直到调度该事件为止.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
| 归档时间: |
|
| 查看次数: |
7821 次 |
| 最近记录: |