在initialize()
函数内部有一个jQuery each
循环。在该循环内部是对this.dbcolumns
的引用,这显然不起作用,因为jQuery已将this
重新分配给当前循环元素。那么如何从循环内引用this.dbcolumns
?它在循环外工作正常。
function datatable() {
this.url = '';
this.htmltable = '';
this.dbtable = '';
this.dbcolumns = new Array();
this.idfield = 'id';
this.pageno = 0;
this.pagesize = 15;
this.totalpages = 0;
this.totalrecords = 0;
this.searchterm = '';
this.initialize = function() {
this.dbtable = $(this.htmltable).attr('data-table');
this.dbcolumns.push(this.idfield);
$(this.htmltable + ' th[data-field]').each(function(i, col){
this.dbcolumns.push( $(col).attr('data-field') ); /* <<<<<<<<<< this line */
});
return this;
}
}
答案 0 :(得分:14)
引用你想要保持在循环之外的“this”。
var self = this;
然后你可以在循环中使用“self”。
答案 1 :(得分:4)
在this
回调之外存储对each
的引用,或使用ES5 bind
method:
$(this.htmltable + ' th[data-field]').each(function(i, col){
this.dbcolumns.push( $(col).attr('data-field') );
}.bind(this));
或者,如评论中所述,使用$.proxy
:
$(this.htmltable + ' th[data-field]').each($.proxy(function(i, col){
this.dbcolumns.push( $(col).attr('data-field') );
}, this));
答案 2 :(得分:3)
要解决的常见JS模式是使用闭包:
this.initialize = function() {
var that = this;
this.dbtable = $(this.htmltable).attr('data-table');
this.dbcolumns.push(this.idfield);
$(this.htmltable + ' th[data-field]').each(function(i, col){
that.dbcolumns.push( $(col).attr('data-field') ); /* <<<<<<<<<< this line */
});
return this;
}