Todo.js中提到的关键字是什么? (骨干教程)

时间:2012-08-24 00:46:35

标签: backbone.js

我很难理解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

1 个答案:

答案 0 :(得分:3)

this作为第三个参数是在调用第二个参数中的函数时设置的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。