【问题标题】:Best approach to avoid javascript's “this” mistakes in XBL在 XBL 中避免 javascript 的“this”错误的最佳方法
【发布时间】:2010-12-23 16:26:28
【问题描述】:

谈论 XBL 并不完全是谈论 javascript。所以我将创建这个与this one 相关的问题,但现在是关于 XBL,我不是根 javascript 代码的创建者,而只是绑定中的方法和事件处理程序的创建者。

--

在某些情况下,this 关键字可能不是我期望的对象。 (最近的例子:in an key event, in my XBL)

避免此类错误的最佳方法是什么?

目前,我一直在使用 getElementById(或来自 jQuery 的 $.fn),但我不确定这是否是最好的方法。

--更新

更多细节:

XBL method 中,访问Xul 文件(GUI 描述文件)中定义的元素的唯一方法是不使用“this”(因为它可能不是我期望的“this”) getElementById,这使得代码不可重用,所以我正在寻找替代方案..

【问题讨论】:

    标签: javascript binding xul this xbl


    【解决方案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 对象应用为this多变的。

    剩下的代码只是一些测试代码:一个foo函数,它会提醒this.hello,一个bar对象和一个hello成员,以及如何绑定foobar .

    本质上,我采用了一个不接受参数的函数并生成了另一个函数,以确保始终使用正确的this 变量调用第一个函数。非常适合事件处理程序。

    (对不起,我对XBL一无所知,所以我希望这会有用。)

    【讨论】:

    • bind 是在 EcmaScript 5 中构建的,新的strict 模式让很多this 问题快速失败。
    • 感谢您的回答,在您的示例中,您可以将“bar”用作“self”,但在 XBL method 中是访问 Xul 文件中定义的元素的唯一方法(GUI 描述文件)带有 getElementById,这使得代码不可重用,所以我正在寻找替代方案..
    • 而不是写 otherDoc.addEventListener("event", this.myMethod, false);你现在写 otherDoc.addEventListener("event", this.bindFunction(this, this.myMethod), false);
    • 现在,我发现我可以使用var self = thisaddEventListener("event", function() { self.myMethod() }, false) 之类的方法。
    【解决方案2】:

    如果没有最佳答案,一个好的方法是使用 javascript 文件而不是 XBL 来实现。查看 Xulrunner 源代码,看起来大多数代码都是这样做的。

    但我仍然想使用 XBL,如果有办法很好地使用它的话..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2012-02-19
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多