我刚刚开始使用OO javascript,所以请耐心等待。
这有效:
var myObj = {
foo : function() {
alert('hello');
this.bar();
},
bar: function() {
alert('world');
}
}
但是,如果我在“foo”方法中的hello警告之后执行其他操作,那么“this”的含义会从对象更改为我上次选择的任何内容,因此使用this.bar()
不执行其他方法在课堂里。
所以我试着在这样的变量中缓存“this”:
var myObj = {
publicVars: {
theObj : this
},
foo : function() {
alert('hello');
publicVars.theObj.bar();
},
bar: function() {
alert('world');
}
}
但这也不起作用。那么解决方案是什么?
这是我的实际代码:
var formObj = {
validate : function(theForm) {
$('input, textarea', theForm).each(function() {
var valueLength = $(this).val().length;
if (valueLength === 0) {
$(this).addClass('invalid');
this.listenForInput($(this)); // <!------- this isn't working
}
});
},
listenForInput : function(theField) {
// theField.keyup(function() {
// if ($(this).val().length > 0) {
// theField.removeClass('invalid');
// }
// });
alert('I work!!!!');
}
} // end obj
答案 0 :(得分:5)
正如我在评论中所说,你必须在函数中保留一个引用:
validate: function(theForm) {
var self = this;
$('input, textarea', theForm).each(function() {
var valueLength = $(this).val().length;
if (valueLength === 0) {
$(this).addClass('invalid');
self.listenForInput($(this));
}
});
},
您正在将函数传递给each
。在此回调中,this
引用DOM元素。这就是你将它传递给jQuery($(this)
)以便能够在该元素上调用jQuery方法的原因。它也不能引用formObj
!
this
所指的内容取决于如何调用一个函数,每个函数都有自己的this
(Mozilla documention描述this
更详细)。
如果您使用validate
致电formObj.validate()
,则this
会引用formObj
。
jQuery documentation for each
声明:
更重要的是,回调是在当前DOM元素的上下文中触发的,因此关键字
this
引用该元素。
答案 1 :(得分:2)
我错过了什么,或者你不能只是按名称引用对象,如下所示:
var myObj = {
foo: function() {
alert('hello');
myObj.bar();
},
bar: function() {
alert('world');
}
}
myObj.foo();
答案 2 :(得分:0)
函数的此关键字由调用设置,在函数执行期间不能更改。
调用obj.foo()
将 foo 的此设置为 obj ,以便调用 this.bar 调用 obj.bar 。但是,如果您以其他方式调用 foo ,例如:
var a = obj.foo;
a();
然后它的这个可能是 obj (在上面的例子中它将是 window 或 undefined in严格模式)如果此对象没有 bar 属性,您将获得不同的 bar 或错误。