2012-03-23 59 views
0

我有这样的代码:有关闭问题。似乎无法解决它。请指教

_trackit: function(){ 
    for(var key in this.items.sublinks){ 
    switch(key){ 
     case 'shoes': 
      for(var innerkey in this.items.sublinks[key]){ 
       (function(){ 
        $(innerkey).observe('click', (function(e){ 
        Event.stop(e); 
        someClass.click_link(this.items.sublinks[key][innerkey],false) 
        })); 
       )(this); 
      } 
     break; 
    } 
    } 
} 

我传递中的散列的大小为2,但你会猜这两个环节(因为哈希映射到链接),逝去的最后哈希值来通过(someClass.click_link < - 在这里这个值,this.item.sublinks[key][innerkey])。

我试过使用innerfuction等...但有些搞乱了。如果我去“内功能深”,则this.items返回undefined

任何帮助?

回答

1

正如其他人所提到的,你需要有一个参数,收到“这个”你逝去。您还需要传递“key”和“innerkey”变量的副本,以避免循环内部的闭包错误。

var make_event_listener = function(that, key, innerKey){ 
    return function(e){ 
     Event.stop(e); 
     someClass.click_link(that.items.sublinks[key][innerkey], false) 
    }; 
}; 

//... 
for(var innerkey in this.items.sublinks[key]){ 
    $(innerkey).observe('click', make_event_listener(this, key, innerKey)); 
} 
//... 

当然,你可以使用make_event_listener的匿名版本代替,但我觉得这种方式更具有可读性。

+0

非常感谢。 – 2012-03-23 23:54:16

2

既然你在通过this作为参数,你只需要创建一个参数为它—调用它,比方说,_this —然后你可以参考_this而不是this里面的功能:

   (function(_this, innerkey){ 
        $(innerkey).observe('click', (function(e){ 
        Event.stop(e); 
        someClass.click_link(_this.items.sublinks[key][innerkey],false) 
        })); 
       )(this, innerkey); 

(还有其他的方法为好,但上面似乎是你所追求的,当你在作为参数传递this的方法是什么?它是做一个非常值得尊敬的方式。)

编辑补充:每罗布W公司评论,我已经编辑的上面添加innerkey作为参数为好,这是因为否则的内function(e){...}表达式将是指相同的innerkey可变作为外功能—的变量而言,作为循环变量,在内部函数实际运行时可能已经发生了变化。将其作为参数传递给内部表达式时,会创建一个新的innerkey变量,该变量等于内部函数创建时innerkey

+1

不要忘记'innerKey'变量。 – 2012-03-23 22:02:21

+0

@RobW:对,在封闭实际运行时,它可以改变它引用的内容。好点,我会解决这个问题。谢谢! – ruakh 2012-03-23 22:05:09

+0

非常感谢 – 2012-03-23 23:54:02

1

对“this”的第二次调用引用正在单击的实际元素。将其更改为:

_trackit: function() { 
    var self = this; 
    for (var key in this.items.sublinks) { 
     switch (key) { 
     case 'shoes': 
      for (var innerkey in this.items.sublinks[key]) { 
       (function() { 
        $(innerkey).observe('click', (function (e) { 
         Event.stop(e); 
         someClass.click_link(self.items.sublinks[key][innerkey], false) 
        }));)(this); 
       } 
       break; 
      } 
     } 
    } 
} 
相关问题