我是一个Backbone,Javascript,jQuery noob并试图解决问题。在我的Backbone视图中,我有这个方法:
setError: function (selection, text) {
console.log("set error");
this.$el.find(selection).html(text);
this.$el.find(selection).show();
},
我想从另一个填充错误字段的方法调用此方法,并在div中追加其他消息。所以我尝试像这样调用setError:
populateErrors: function (sampleErrors) {
console.log("populateErrors");
_.each(sampleErrors, function (sample) {
// Set the error
this.setError('#sample-error', 'test');
$('#sample-validation-form').append('<p>testing</p>');
}, this);
}
我不明白的是如何调用setError。所以如果我在_.each语句之外调用它,我可以执行this.setError。这对我来说很有意义,因为我用这个Backbone对象调用了setError。至少那是我解释它的方式。如果不正确,请告诉我。
但是在_.each语句中,我想,因为我将语句与this
绑定为最后一个参数,我认为在setError之前我不需要this
。但是当我尝试这个时,我得到setError是未定义的。那么我尝试this.setError
,如上所示,但是当我在_.each循环之外调用this.setError
时,我没有得到我的“测试”输出。有人可以向我解释这个函数上下文在这个例子中是如何工作的。我完全糊涂了!提前谢谢!
答案 0 :(得分:1)
当你传递一个对象foo
作为第三个参数时,你会说:在匿名函数中,this
应该是foo
。
populateErrors: function (sampleErrors) {
// `this` is the Backbone view here
this.setError('#sample-error', 'test');
_.each(sampleErrors, function (sample) {
// since you passed the view (this) to `each`
// `this` is the Backbone view here also
this.setError('#sample-error', 'test');
}, this);
}
答案 1 :(得分:0)
_.each的第三个参数是上下文。 javascript函数的上下文是对函数中“this”的引用。通过传递“this”,您可以保持当前的背景。
例如:
populateErrors: function (sampleErrors) {
var x = {
blah: "x context"
};
this.blah = "orig context";
console.log("populateErrors");
_.each(sampleErrors, function (sample) {
// Here, your current context is the same context as
// when you called populate Errors
// this.blah === "orig context";
}, this);
_.each(sampleErrors, function (sample) {
// Here, you've defined a different context.
// this.blah === "x context";
}, x);
}
唯一可以避免使用“这个”的时间。在你的表达式前面是你使用“with”关键字。见https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/with