Значение ключевого слова "это" в jQuery Vs MVC - PullRequest
6 голосов
/ 20 марта 2012

Я пытаюсь понять разницу в использовании ключевого слова "this" или, скорее, того, что оно представляет в jQuery по сравнению с инфраструктурой MVC, такой как Backbone.

Ниже приведены 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» относится к элементу DOM в jQuery.

Я хотел понять, что он представляет в случае кода Backbone.

Пожалуйста, дайте мне знать.

Ответы [ 2 ]

3 голосов
/ 20 марта 2012

this - контекст, в котором выполняется функция.

Хитрость в понимании this - это понимание того, как вы выполняете функцию, которая ее определяет.

Когда вы передаете функцию методу, например jQuery, вы используете эту функцию в качестве метода обратного вызова. jQuery явно устанавливает контекст обратного вызова при его выполнении.

Когда вы вызываете метод объекта с помощью точечной нотации: myView.render() именно точечная нотация явно устанавливает контекст вызова метода для объекта перед точкой.

Правила установки контекста довольно просты в JavaScript, но могут привести к путанице. Большинство языков устанавливают переменную контекста с собственной ссылкой для объекта, в котором был определен метод. Однако JavaScript использует шаблон вызова метода для определения контекста.

Когда мы передаем метод любого объекта как метод обратного вызова, код, который вызывает его, устанавливает контекст метода - это включает в себя представления Backbone и другие объекты. Вы можете явно переопределить это, используя функции bind и bindAll (http://documentcloud.github.com/underscore/#bind) Underscore.js, а также несколько других приемов.


Backbone.View.extend({
  initialize: function(){
    _.bindAll(this);
  }
});

Этот код, например, свяжет контекст всех функций в текущем объекте представления с представлением. Это гарантирует, что контекстом ваших методов представления всегда будет само представление.

Подробнее см .:

1 голос
/ 20 марта 2012

В Backbone 'this' внутри представления относится к текущему объекту представления. В моделях «this» относится к текущему объекту модели. И аналогично для коллекций «this» относится к текущему объекту коллекции.

Но для представлений «this» является переходным между выбранным элементом dom с помощью jQuery и объектом представления, поэтому мы используем функцию _.bindAll, чтобы мы могли быть уверены, что «this» останется текущим объектом представления при вызове определенного такие функции, как 'render' и т. д. См. http://documentcloud.github.com/underscore/#bindAll

...