我一直在寻找解决这个问题的方法。我正在使用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 ++)循环,但我试图让它更清洁。感谢您提供的任何指导。
答案 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));
});
}