Javascript中的引用对象调用函数

Javascript中的引用对象调用函数,javascript,events,reference,Javascript,Events,Reference,我在JS中有一个临时事件系统,附件如下所示: events.attach(events.NEW_TASK,this.update); 其中,this.update是一个回调/处理程序/函数。问题是,当调度器尝试调用此处理程序时,它会丢失其原始上下文。如何将处理程序与调用attach函数的对象的上下文绑定,而不将this作为参数传递并使用它 编辑:我还应该提到,它将是一个框架,因此对于其他开发人员来说必须简单,因此最好不需要将上下文存储在另一个变量中。您可以将“this”的引用存储在局部变量中,

我在JS中有一个临时事件系统,附件如下所示:

events.attach(events.NEW_TASK,this.update);
其中,
this.update
是一个回调/处理程序/函数。问题是,当调度器尝试调用此处理程序时,它会丢失其原始上下文。如何将处理程序与调用attach函数的对象的上下文绑定,而不将
this
作为参数传递并使用它


编辑:我还应该提到,它将是一个框架,因此对于其他开发人员来说必须简单,因此最好不需要将上下文存储在另一个变量中。

您可以将“this”的引用存储在局部变量中,并尝试使用它调用函数

var that = this;

events.attach( events.NEW_TASK, function( ) { that.update(); } );

您可以将“this”的引用存储在局部变量中,并尝试使用它调用函数

var that = this;

events.attach( events.NEW_TASK, function( ) { that.update(); } );
另一个选项使用新方法的一部分:

另一个选项使用新方法的一部分:


在ECMAScript 5被浏览器广泛采用之前,您可以使用自己的
Function.prototype.bind实现:

function bind(func, thisObj) {
    return function() {
        func.apply(thisObj, arguments);
    };
}

events.attach(events.NEW_TASK, bind(this.update, this));

在ECMAScript 5被浏览器广泛采用之前,您可以使用自己的
Function.prototype.bind实现:

function bind(func, thisObj) {
    return function() {
        func.apply(thisObj, arguments);
    };
}

events.attach(events.NEW_TASK, bind(this.update, this));

... 这一切都很好,但不可用作一般解决方案。然而,@Tim,一个几乎符合标准的实现非常容易编写(在answer I链接中约8行),我们很快就会在主要的JS引擎中实现本机实现(,)。我相信这将是未来几年内最常用的方法,没有理由不使用标准方法……嗯,我非常同意你的看法。我的答案是避免扩展
函数。prototype
,因为我不喜欢扩展本机原型,也不喜欢在可能的情况下为不同的浏览器提供两个单独的分支。@Tim,是的,我也反对用非标准方法扩展本机原型,在这种情况下是这样的(例如ES5
Array.prototype
additions)我认为扩展它的兼容性没有问题,因为我知道本机实现很快就会出现,或者更晚。分支之间的区别在于,在使用本机实现的浏览器中,与使用自定义实现相比,这些方法的速度会非常快……是的,我很欣赏您提到的好处。T老实说,我不是教条式地反对扩展
函数.prototype
数组.prototype
。我只是担心页面中的其他脚本可能有相同的想法,但做得不对……这些都很好,但不能作为通用解决方案使用。然而。@Tim,一个几乎符合标准的实现实际上是simple需要编写(~8行在answer I链接中),我们很快就会在主要的JS引擎中实现本机实现(,).我相信这将是未来几年最常用的方法,没有理由不使用标准方法…好吧,我非常同意你的看法。我的回答避免扩展
函数。prototype
,因为我不喜欢扩展本机原型,也不喜欢为不同的浏览器使用两个单独的分支这里有可能。@Tim,是的,我也反对用非标准方法扩展本机原型,在这种情况下,IMHO(例如ES5
Array.prototype
additions)我认为扩展它的兼容性没有问题,因为我知道本机实现很快就会出现,或者更晚。分支之间的区别在于,在使用本机实现的浏览器中,与使用自定义实现相比,这些方法的速度会非常快……是的,我很欣赏您提到的好处。T老实说,我并不武断地反对扩展
Function.prototype
Array.prototype
。我只是担心页面中的其他脚本可能有同样的想法,并且做得不对。