谈论XBL并不是在谈论javascript。所以我将创建与this one相关的问题,但现在关于XBL,我不是根javascript代码的创建者,而只是绑定中的方法和事件处理程序。
-
在某些情况下,this
关键字可能不会引用我期望的对象。 (最近的例子:in an key event, in my XBL)
避免这种错误的最佳方法是什么?
现在,我总是使用getElementById
(或来自jQuery的$.fn
),但我不确定这是否是最佳方法。
- 更新
更多细节:
在XBL method范围内访问Xul文件(GUI描述文件)中定义的元素而不使用“this”的唯一方法(因为它可能不是“this”I expect)与getElementById一起使用,这使代码无法重复使用,所以我正在寻找替代品..
答案 0 :(得分:1)
正如您在其他地方所听到的那样,问题是this
参数不一定是您首先想到的对象,尤其是当您谈论事件处理程序等时。我找到的最好的方法是编写一个小函数,将一些对象绑定为this
变量,并返回另一个使用绑定调用原始函数的函数。
看看这段代码:
var bindFunction = function(self, f) {
return function() {
return f.apply(self);
};
};
var foo = function() {
alert(this.hello);
};
var bar = {
hello: "Hello there"
};
var boundFoo = bindFunction(bar, foo);
boundFoo();
我所拥有的是一个名为bindFunction
的函数,它接受一个对象(称为self
)和一些函数,并返回另一个函数,该函数将调用传入函数应用self
object作为this
变量。
其余代码只是一些测试代码:foo
函数会提醒this.hello
,bar
对象有hello
成员,以及如何将foo
与bar
绑定。
本质上,我采用的函数不接受任何参数并生成另一个函数,以确保始终使用正确的this
变量调用第一个函数。非常适合活动处理程序。
(对不起,但我对XBL一无所知,所以我希望这会有用。)
答案 1 :(得分:0)
如果没有最佳答案,一个好的方法可能是使用javascript文件而不是XBL来实现。查看Xulrunner源代码,看起来像大多数代码都这样做。
但我仍然想使用XBL,如果有办法可以正常工作..