"this" JavaScript 回调函数中的关键字



我对"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')
});

不要使用self.<member>,而是尝试使用Tweets.<member>。不能在方法内部执行var self = this,因为this已经不是Tweets了。但是,由于您有一个变量来引用您正在创建的对象,您可以直接使用它。:)

您还可以将事件处理程序包装在一个匿名函数中,如下所示:

self.config.form.on('submit', function(e) { self.fetchTweets(e); });

然后不要在绑定处理程序的方法之外的任何方法中执行var self = this;。使用this是安全的。

最新更新