我试图理解使用关键字“this”的区别,或者更确切地说,它在jQuery Vs和Backbone等MVC框架中所代表的含义。
以下是每个代码样本的2个; 所以在jQuery中,我们有
$("#result").click(function(){
$(this).html(someval);
})
在Backbone中,我们的代码为;
var HandlebarsView = Backbone.View.extend({
el: '#result'
initialize: function(){
this.template = Handlebars.compile($('#template').html());
},
render: function(){
var html = this.template(this.model.toJSON());
this.$el.html(html);
}
});
现在我明白“this”是指jQuery中的DOM元素。
我想了解Backbone代码的含义。
请告诉我。
答案 0 :(得分:3)
this
是函数执行的上下文。
理解this
的技巧是理解它是你执行决定它的函数的方式。
当您将函数传递给类似jQuery的方法时,您将该函数用作回调方法。 jQuery在执行时显式设置回调的上下文。
使用点符号调用对象上的方法时:myView.render()
这是点符号,它明确地将方法调用的上下文设置为点前面的对象。
在JavaScript中设置上下文的规则非常简单,但会引起很多混乱。大多数语言将自引用上下文变量设置为定义方法的对象。但是,JavaScript使用方法调用模式来确定上下文。
当我们将任何对象的方法作为回调方法传递时,调用它的代码会设置方法的上下文 - 这包括Backbone的视图和其他对象。您可以使用Underscore.js'bind
和bindAll
函数(http://documentcloud.github.com/underscore/#bind)以及其他一些技巧来明确覆盖它。
Backbone.View.extend({
initialize: function(){
_.bindAll(this);
}
});
例如,此代码将当前视图对象上的所有函数的上下文绑定到视图。这可以保证视图方法的上下文始终是视图本身。
有关详细信息,请参阅:
答案 1 :(得分:1)
在Backbone中,'this'在视图内部引用当前视图对象。在模型中,“this”指的是当前的模型对象。同样对于集合'this'指的是当前的集合对象。
但是对于视图'这'在jQuery和view对象的选定dom元素之间是暂时的,这就是我们使用_.bindAll函数的原因,这样我们可以确保当我们调用某些时'this'仍然是当前的视图对象像'render'等功能。请参阅http://documentcloud.github.com/underscore/#bindAll