jQuery Vs MVC中关键字“this”的含义

时间:2012-03-20 11:44:03

标签: javascript jquery backbone.js javascript-framework

我试图理解使用关键字“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代码的含义。

请告诉我。

2 个答案:

答案 0 :(得分:3)

this是函数执行的上下文。

理解this的技巧是理解它是你执行决定它的函数的方式。

当您将函数传递给类似jQuery的方法时,您将该函数用作回调方法。 jQuery在执行时显式设置回调的上下文。

使用点符号调用对象上的方法时:myView.render()这是点符号,它明确地将方法调用的上下文设置为点前面的对象。

在JavaScript中设置上下文的规则非常简单,但会引起很多混乱。大多数语言将自引用上下文变量设置为定义方法的对象。但是,JavaScript使用方法调用模式来确定上下文。

当我们将任何对象的方法作为回调方法传递时,调用它的代码会设置方法的上下文 - 这包括Backbone的视图和其他对象。您可以使用Underscore.js'bindbindAll函数(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