Я хорошо понимаю ключевое слово "this", но по какой-то причине оно все еще сбивает меня с толку в этом конкретном случае.Внутри метода bindEvents, когда я связываю событие submit с формой, он затем выполняет fetchTweets.Теперь я понимаю, что теперь она внутри функции обратного вызова из метода «on», поэтому «this» теперь относится к форме, к которой было привязано событие, а не к родительскому объекту «Tweets».Было то, что обычной практикой является объявление self = this в верхней части метода для кэширования родительского объекта, чтобы предотвратить последующие проблемы с обратным вызовом, но в этом случае это не будет работать, потому что единственная цель этого метода - бытьфункция обратного вызова для события отправки формы.
Я знаю о .call и .apply и даже $ .proxy, мне просто было интересно, нужно ли их использовать в этом случае, или я пропускаючто-то очевидное.У меня есть этот код, работающий с использованием $ .proxy, я просто подумал, что может быть разумнее сделать это.
var Tweets = {
init: function ( config ) {
var self = this;
self.config = config;
self.url = 'http://search.twitter.com/search.json?callback=?';
self.bindEvents();
},
bindEvents: function() {
var self = this;
// bind events as needed
self.config.form.on('submit', self.fetchTweets );
},
fetchTweets: function(e) {
e.preventDefault();
var self = this;
var term = self.config.form.find('#term').val();
// grab tweets from the server
$.getJSON(self.url, { q: term }, function(data) {
self.displayTweets(data);
});
},
displayTweets: function(data) {
var self = this;
var tweetList = self.config.list;
tweetList.empty();
// append each tweet to the list
$.each(data.results, function(index, tweet){
$('<li></li>').text(tweet.text).appendTo(tweetList);
});
}
};
Tweets.init({
form: $('#getTweets'),
list: $('#tweets')
});