javascript对象文本中定义的事件处理程序可以访问自身吗?

javascript对象文本中定义的事件处理程序可以访问自身吗?,javascript,javascript-events,event-handling,Javascript,Javascript Events,Event Handling,我知道如果对象是一个函数,我可以用闭包(var self=this)实现这一点 <a href="#" id="x">click here</a> <script type="text/javascript"> var object = { y : 1, handle_click : function (e) { alert('handling click'); //

我知道如果对象是一个函数,我可以用闭包(var self=this)实现这一点

<a href="#" id="x">click here</a>

<script type="text/javascript">
    var object = {
        y : 1,

        handle_click : function (e) {
            alert('handling click');

            //want to access y here

            return false;
        },

        load : function () {
            document.getElementById('x').onclick = this.handle_click;
        }
    };

    object.load();
</script>

变量对象={
y:1,,
手柄点击:功能(e){
警报(“处理点击”);
//想在这里访问y吗
返回false;
},
加载:函数(){
document.getElementById('x').onclick=this.handle\u click;
}
};
load();

因此,事件处理程序部分连接得很好(我自己测试过),但正如您的注释所示,您无法访问刚刚定义的对象的“y”属性

这项工作:

var object = { 
  y : 1, 
  handle_click : function (e) {
    alert('handling click');

    //want to access y here 
    alert(this.y); 

    return false; 
  }, 
  load : function () { 
    var that = this; 
    document.getElementById('x').onclick = function(e) {
      that.handle_click(e); // pass-through the event object
    }; 
  } 
}; 
object.load();

还有其他方法可以做到这一点,但这是可行的。

将对
句柄的调用绑定到它所定义的对象的最简单方法如下:

        var self=this;
        document.getElementById('x').onclick = 
           function(e) { return self.handle_click(e) };
如果您需要传入参数或希望使代码看起来更干净(例如,如果您正在设置许多类似的事件处理程序),则可以使用currying技术来实现相同的目的:

bind : function(fn)
{
   var self = this;
   // copy arguments into local array
   var args = Array.prototype.slice.call(arguments, 0); 
   // returned function replaces first argument with event arg,
   // calls fn with composite arguments
   return function(e) { args[0] = e; return fn.apply(self, args); };
},


我知道怎么用杰森的最新一个。如果没有匿名函数,有什么方法可以这样做吗?

多亏了AddEventListener,我们可以使用处理程序方法直接传递对象,并且您可以访问其属性:


希望这将有助于那些像我一样,在几年后寻找这个话题的人

问题不在于onclick处理程序的设置,这很好。问题是当handle\u click执行时,无法访问“y”变量的值。它不起作用-我测试了它,但由于事件处理程序的工作方式,它返回时未定义,“this”成为触发click事件的元素(至少在FF3中是这样)。好吧,也许我误解了这个问题?发布的代码sw234工作正常-但正如您所指出的,在“handle\u click”中无法访问“y”。我以为他是在问如何绑定处理程序,以便它可以通过这个提供对“y”的访问…好吧,也许我也误解了这个问题-有多种方法可以处理这个问题,你的方法也可以。我知道比需要的更复杂。Jason,你可以更改警报(y);提醒(这件事);,结果是一样的-你已经在对象的上下文中调用了处理程序,不需要把y作为参数传入。是的,我明白了。当我受到止痛药的影响时,我需要避免发帖p你要么被闭包约束,要么被全局变量约束。你为什么要在关门时翘鼻子?它们是JavaScript最好的特性之一。。。
        document.getElementById('x').onclick = this.bind(this.handle_click, 
           "this parameter is passed to handle_click()",
           "as is this one");