关于prototype.js .each方法的匿名函数中的“this”的问题

时间:2011-09-16 22:37:47

标签: javascript prototypejs

我一直在寻找解决这个问题的方法。我正在使用prototype.js 1.6.0.1创建一个表,并且在使用.each函数的上下文中遇到了这个对象的问题。这是一个snippit。

var Table = Class.create({
  initialize : function(id) {
    this.elmnt = $(id);
    this.rows = [];
  },
  initRows : function() {
    $A(this._elmnt.tBodies).each(function(body) {
      $A(body.rows).each(function(row) {
        //right here is where i would like to call
        // this.rows.push(row);
        console.log(this); // prints DOMWindow
      });
    });
  }
});

正如您在第二个.each函数中看到的那样,这将解析为DOMWindow。我希望能够致电this.rows.push(row),但我不能因为“这个”没有按预期解决。

任何帮助将不胜感激。我知道我可以做标准(i = 0; i< length; i ++)循环,但我试图让它更清洁。感谢您提供的任何指导。

2 个答案:

答案 0 :(得分:4)

解决此问题的最简单方法是在this开头保存initRows并在each函数中引用

initRows : function() {
    var self = this;
    $A(this._elmnt.tBodies).each(function(body) {
      $A(body.rows).each(function(row) {
        //right here is where i would like to call
        self.rows.push(row);
        console.log(self); // prints DOMWindow
      });
    });
  }

您遇到的问题是this可以由函数的调用者操纵。在回调中将this设置为与回调相关的元素非常常见。在each的情况下,它被设置为值的当前迭代的元素。

self技巧有效,因为它保存this,因为它绑定在函数initRows中,然后在迭代中使用该保存的值。

答案 1 :(得分:0)

initRows : function() {
    $A(this._elmnt.tBodies).each(function(body) {
        $A(body.rows).each((function(e, row) {
            e.rows.push(row);
            console.log(e);
        }).bindAsEventListener(this, row));
    });
}