self.el vs this.el

时间:2012-06-13 12:24:18

标签: javascript jquery backbone.js

我正在关注backbone.js tutorial并遇到了2个函数initialize()render()initialize()$(self.el).append()使用render()时附加一些html时使用了$(this.el).append()。我对这种差异感到困惑,会很感激解释,谢谢!

JS代码

// Views
window.WineListView = Backbone.View.extend({

    tagName:'ul',

    initialize:function () {
        this.model.bind("reset", this.render, this);
        var self = this;
        this.model.bind("add", function (wine) {
            $(self.el).append(new WineListItemView({model:wine}).render().el);
        });
    },

    render:function (eventName) {
        _.each(this.model.models, function (wine) {
            $(this.el).append(new WineListItemView({model:wine}).render().el);
        }, this);
        return this;
    }
});

2 个答案:

答案 0 :(得分:4)

当事件触发时范围发生变化时,第一个使用self来保留对this的引用。在匿名函数内部(对于事件处理程序),this将引用触发事件的元素而不是Backbone控制器。

在第二种情况下不需要引用。

答案 1 :(得分:3)

原因是JavaScript如何处理范围。

初始化函数中的

他们做了

var self = this;

所以当它们绑定对WineListView实例的引用时,在

上调用了初始化的实例
this.model.bind("add", function (wine) {
    $(self.el).append(new WineListItemView({model:wine}).render().el);
 });

但如果你将“this”作为第三个参数发送,那么可以在没有自变量的情况下完成。 第三个参数应该规定应该在

中调用回调的范围
this.model.bind("add", function (wine) {
    $(this.el).append(new WineListItemView({model:wine}).render().el);
 }, this);

如果你看看渲染是绑定,它也使用第三个参数

this.model.bind("reset", this.render, this);

Disclamer我曾经尝试过代码,但是从阅读骨干文档中得到了这个 http://backbonejs.org/#FAQ-this