我有一个MessageHelper对象,它有一个idx var。现在我想从索引方法访问和修改它。我认为'这个'可以,但我得到了NaN。任何线索?
var MessageHelper = {
idx: 8,
formatDate: function(){
return function(text, render) {
// // parse date
var date = $.trim(render(text));
var mom = moment(date);
return mom.format("D/M/YY");
}
},
formatDateTime: function(){
[...]
},
getImportance: function(){
[...]
},
index: function(){
return function(text, render) {
this.idx++;
return this.idx;
}
}
}
答案 0 :(得分:2)
函数内this
的值取决于函数的调用方式。如果您希望始终使用特定值this
调用函数,最简单的方法是使用Function.prototype.bind
:
index: function(){
return function(text, render) {
this.idx++;
return this.idx;
}.bind(this); // <--- HERE
}
在这个例子中,我依赖于外部函数将被调用的事实:
MessageHelper.index()
所以在其中,this
实际上是MessageHelper。因此,MessageHelper也将在索引返回的函数内this
。
如果你打算做某些事情,比如将索引函数作为参数传递给某个地方,它就不会按预期调用,整个事情都会失败。在这种情况下,您应该绑定到MessageHelper:
var MessageHelper = {
index : function(){}.bind(MessageHelper);
}
var myIndex = MessageHelper.index;
myIndex(); // this will return the correct function, bound to MessageHelper
答案 1 :(得分:1)
this
返回的函数内的范围(index
)是函数本身。外部索引,this
指的是MessageHelper
。
所以基本上你必须做类似的事情:
var MessageHelper = {
idx: 8,
index: function(){
var self = this; // MessageHelper
return function(text, render) {
self.idx++;
return self.idx;
}
}
}
您也可以使用bind,但旧浏览器不支持此功能。
提示:如果您没有定义构造函数,则约定是使用小写命名对象。在你的情况下messageHelper。