假设我们在一个基于模型的视图中,并且我们想要绑定到模型的更改事件:
this.model.on('change', this.render);
on通话看到两件事:
- 事件名称,一个简单的字符串。
- 处理程序,一个函数。
on无法知道 in 是什么this意思this.render,它只是看到一个函数;on甚至不知道上面的调用和这个之间的区别:
this.model.on('change', function() { ... });
如果您的函数需要特定的上下文,那么您有两种选择:
- 使用、、、、、CoffeeScripts
_.bind、闭包技巧或任何创建或模拟绑定函数的方法来创建绑定_.bindAll函数。Function.bind$.proxy=>var _this = this
告诉它你想要哪个上下文:
this.model.on('change', this.render, this);
无法展开调用堆栈以查看this您想要的,因此您必须明确说明。
Backbone 将像这样调用回调:
node.callback.apply(node.context || this, ...);
wherenode.callback是回调函数,node.context是给 . 的第三个参数(如果有的话)on。如果您不指定上下文,那么您将得到调用this时发生的任何事情trigger;在上面的示例中,this最终将成为模型。
因此,实际上的第三个参数on是可选的,但默认值并不是非常有用,并且无法选择更好的默认值,您需要选择合理上下文的信息在 JavaScript 中根本无法访问。_.bindAll(this, ...)这就是为什么您会在 Backbone 视图中看到如此多的样板。
如果您尝试过这样的事情:
model.on = function(event, callback){
model.on_with_three_args.call(this, event, callback, this);
});
那么this在那种情况下通常会model这样你真的会说:
model.on = function(event, callback){
model.on_with_three_args.call(model, event, callback, model);
});
或者
model.on = function(event, callback){
model.on_with_three_args(event, callback, model);
});
并且没有任何意义。thisinside的值与调用 的代码中on的值几乎没有关系。在 JavaScript 中不是变量,它是一个关键字,指的是当前调用上下文。thisonthis