我很难理解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”作为第三个参数?
答案 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
上下文。