2

我很难理解 Backbone.js 的 Todo.js 教程中的“this”指的是什么。具体来说,在 AppView 内部:

initialize: function() {
this.input = this.$("#new-todo");
this.allCheckbox = this.$("#toggle-all")[0];

Todos.bind('add', this.addOne, this);
Todos.bind('reset', this.addAll, this);
Todos.bind('all', this.render, this);

this.footer = this.$('footer');
this.main = $('#main');
},

因此,当 Todos.bind('add', this.addOne, this) 被调用时,它会将视图 (this.addOne) 绑定到集合 ('add')。如果是这样,我们假设第三个参数(“this”)也引用了 AppView 对象。为什么我们需要将“this”作为第三个参数?

带注释的源代码:http ://backbonejs.org/docs/todos.html

4

1 回答 1

3

thisas 第三个参数是调用第二个参数中的函数时要设置的上下文this

这听起来很混乱,所以让我试着分解一下。让我们看看这条线...

Todos.bind('add', this.addOne, this);

如果我们改用这个...

Todos.bind('add', function() { this.$el.text("Hello, world!"); });

...我们根本不需要第三个参数。在这种情况下,该函数被立即调用this并被保留。

但是,因为我们不想内联每个函数,所以我们像这样传递对函数的引用......

Todos.bind('add', this.addOne, this);

这与您的示例相同。当你调用一个类似的函数时this.addOne(),它this被设置为this它被调用的那个。

但是,当您传递引用时(不要立即调用它),它的this上下文会丢失,并且在调用时,它将是window,这不是您想要的。

为了防止这种情况,第三个参数this是调用函数时使用的上下文。

在内部,Backbone 将使用_.bind()它来绑定它。这是函数原生bind()方法的 polyfill。

于 2012-08-24T01:04:26.270 回答