2011-09-16 35 views
0

我一直在尋找解決這個問題的小時數。我使用prototype.js 1.6.0.1創建了一個表格,並且在與.each函數相關的上下文中遇到了問題。這裏是一個snippit。關於prototype.js的匿名函數中的「this」的問題。每個方法

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),但我不能像「預計」那樣解決問題。

任何幫助,將不勝感激。我知道我可以做標準(我= 0;我<長度;我++)循環,但我試圖讓這個小清潔劑。感謝您提供的任何指導。

+0

是否有一個原因,你想保持你的'表'對象的行集合?一個'HTMLTableElement'已經保存了它自己的集合。 'this.elmnt.rows'或'this.elmnt.tBodies [0] .rows'。 – user113716

+0

https://developer.mozilla.org/zh/DOM/table.rows – user113716

+0

這就是爲什麼我不喜歡'each()'實現覆蓋'this'的原因。爲什麼我喜歡咖啡腳本,它是非範圍介紹和非上下文強姦數組迭代。 –

回答

4

解決最簡單的方法是節約thisinitRows開始和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中,然後在迭代中使用該保存的值。

+0

謝謝,這對我有所幫助。如果我再次遇到這種情況,這是一件好事。對於var self = this沒興趣,但是它比老式的for循環有更好的解決方案; – kwbock

+2

@grizzgreen:如果您不喜歡該變量,請改爲使用Prototypejs的'.bind()'方法](http://api.prototypejs.org/language/Function/prototype/bind/)。 – user113716

+0

+1可以很好地解釋* this *,而不會將其與範圍或上下文混淆。 :-) – RobG

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)); 
    }); 
} 
+0

我不同意這一點。每個回調都不是一個事件,所以不需要使用'bindAsEventListener()',因爲['each()']的第二個參數(http://api.prototypejs.org/language/Enumerable/prototype/each /)是上下文。在被綁定的地方,「row」不存在,所以不能被curry,「row」只存在於回調中。即使你試圖爲回調綁定一個上下文,你也不會在其中使用'this'的例子。回調的參數是錯誤的,它應該是'(row,index)',其中'index'是可選的。 – clockworkgeek